Перейти к содержимому

Как очистить stack c

  • автор:

Исключения и освобождение стека в C++

В механизме исключений C++ элемент управления перемещается из оператора throw в первый оператор catch, который может обработать выданный тип. По достижении инструкции catch все автоматические переменные, которые находятся в область между операторами бросить и перехватом, уничтожаются в процессе очистки стека. При очистке стека выполнение продолжается следующим образом.

  1. Элемент управления достигает инструкции по обычному последовательному try выполнению. Выполняется защищенный раздел в блоке try .
  2. Если исключение не возникает во время выполнения защищенного раздела, предложения, следовать за try блоком, catch не выполняются. Выполнение продолжается в инструкции после последнего catch предложения, следующего за связанным try блоком.
  3. Если исключение создается во время выполнения защищенного раздела или в любой подпрограмме, вызываемой защищенным разделом напрямую или косвенно, создается объект исключения из объекта, созданного операндом throw . (Это означает, что конструктор копирования может быть вовлечен.) На этом этапе компилятор ищет catch предложение в более высоком контексте выполнения, которое может обрабатывать исключение создаваемого типа или catch обработчика, который может обрабатывать любой тип исключения. Обработчики catch проверяются в порядке их внешнего вида после try блока. Если соответствующий обработчик не найден, проверяется следующий динамически заключенный try блок. Этот процесс продолжается до тех пор, пока не будет рассмотрен самый внешний заключиющий try блок.
  4. Если соответствующий обработчик по-прежнему не найден или исключение возникает во время процесса очистки до получения элемента управления обработчиком, вызывается предопределенная функция времени выполнения terminate . Если исключение возникает после создания исключения, но до начала процесса очистки, вызывается функция terminate .
  5. Если соответствующий обработчик найден, и он перехватывается по значению, его формальный catch параметр инициализируется путем копирования объекта исключения. Если обработчик выполняет перехват по ссылке, параметр инициализируется для ссылки на объект исключения. После инициализации формального параметра начинается процесс очистки стека. Это включает в себя уничтожение всех автоматических объектов, которые были полностью созданы , но еще не деструированы, между началом try блока, связанного с catch обработчиком и сайтом создания исключения. Удаление происходит в порядке, обратном созданию. Обработчик catch выполняется, и программа возобновляет выполнение после последнего обработчика, то есть при первой инструкции или конструкции, которая не является обработчиком catch . Элемент управления может вводить catch обработчик только через исключение, вызываемое исключение, никогда не с помощью goto инструкции или case метки в инструкции switch .

Пример очистки стека

В следующем примере показано, как очистить стек при создании исключения. Выполнение потока переходит от оператора throw в C к оператору catch в main , и при этом удаляются все функции. Обратите внимание, что порядок создания и удаления объектов Dummy соответствует порядку их выхода из области видимости. Также обратите внимание, что завершается выполнение только функции main , содержащей оператор catch. Функция A никогда не возвращается после вызова B() , и B никогда не возвращается после вызова C() . Обратите внимание, что если раскомментировать определение указателя Dummy и соответствующую инструкцию DELETE, а затем запустить программу, указатель не удаляется. Это показывает, что может произойти, если функции не предоставляют гарантию исключения. Дополнительные сведения см. в разделе «Практическое руководство . Проектирование исключений». Если закомментировать оператор catch, можно наблюдать за тем, что происходит при завершении выполнения программы в результате необработанного исключения.

#include #include using namespace std; class MyException<>; class Dummy < public: Dummy(string s) : MyName(s) < PrintMsg("Created Dummy:"); >Dummy(const Dummy& other) : MyName(other.MyName) < PrintMsg("Copy created Dummy:"); >~Dummy() < PrintMsg("Destroyed Dummy:"); >void PrintMsg(string s) < cout string MyName; int level; >; void C(Dummy d, int i) < cout void B(Dummy d, int i) < cout void A(Dummy d, int i) < cout int main() < cout catch (MyException& e) < cout cout > c; > /* Output: Entering main Created Dummy: M Copy created Dummy: M Entering FunctionA Copy created Dummy: A Entering FunctionB Copy created Dummy: B Entering FunctionC Destroyed Dummy: C Destroyed Dummy: B Destroyed Dummy: A Destroyed Dummy: M Caught an exception of type: class MyException Exiting main. */ 

Удаление элементов стека

ошибка

Создать проект, демонстрирующий работу со стеком, организованным на основе списка. Все операции со стеком реализовать через функции. Разработать функцию удаления элементов стека, кратных 3, если такие есть. Дополнить проект функцией очистки стека clear(), сохранения в файл и считывания из файла. Проблема, собственно, в удалении, вроде как удаляет, но при проверке выводом получается совсем не то и выводит ошибку. Косяк явно в функции, но решить не получается. Буду очень признательна за помощь

 #include "stdafx.h" #include #include #include using namespace std; struct STACK < int Name; STACK *next, *prev, *head; >; int _tmain(int argc, _TCHAR* argv[]) < int buff[100]; setlocale(LC_CTYPE, "Russian"); STACK* Nstk = NULL; int n, chislo, i; cout > n; for (i = 0; i > chislo; buff[i] = chislo; push(chislo, Nstk); > delete3(Nstk); return 0; > void delete3(STACK *&Nstk) < STACK *temp = Nstk; STACK *tmp; while (temp) //сама функция удаления// < if ((temp->Name)%3==0) < tmp = temp; temp = temp->next; delete tmp; > temp = temp->next; > cout void push(int strN, STACK *&Nstk) < STACK *tmp = new STACK;//выделение памяти для нового элемента tmp->Name = strN;//запись элемента в поле tmp->next = Nstk; Nstk = tmp; > 

Отслеживать

Captain Leonardo

задан 27 мар 2018 в 13:44

Captain Leonardo Captain Leonardo

3 1 1 серебряный знак 5 5 бронзовых знаков

push(chislo, Nstk); — ??

– user176262

27 мар 2018 в 13:47

Стирайте все лишнее, оставляйте MCVE (минимальный компилируемый верифицируемый пример).

– user227465

27 мар 2018 в 13:48

@Igor, поместить введённое число в стек Nstk

27 мар 2018 в 13:49

@CaptainLeonardo Про это я догадался :). Код добавьте.

– user176262

27 мар 2018 в 13:50

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

struct STACK < int Name; STACK *next, *prev, *head; >; 
void delete3(STACK *&Nstk) < STACK *temp = Nstk; STACK *tmp; while (temp) //сама функция удаления// < if ((temp->Name) %3 == 0) < tmp = temp; temp = temp->next; delete tmp; > temp = temp->next; > cout
  1. Если мы удалили элемент из вершины стека, то в основной программе указатель на вершину ведет в никуда
  2. Когда мы удаляем элемент, то мы дважды вызываем temp = temp->next;

Как должно быть

void delete3(STACK *&Nstk) < while (Nstk) < if ((Nstk->Name) % 3 == 0) < STACK *temp = Nstk; Nstk = Nstk->next; delete temp; > else Nstk = Nstk->next; > cout
  1. И не забудьте в конце удалить все элементы из стека

Stack.Clear Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Удаляет все объекты из Stack .

public: void Clear();
public void Clear ();
member this.Clear : unit -> unit
Public Sub Clear ()

Примеры

В следующем примере кода демонстрируется несколько методов универсального Stack класса, включая Clear метод .

В примере кода создается стек строк с емкостью по умолчанию и используется Push метод для отправки пяти строк в стек. Элементы стека перечисляются, что не изменяет состояние стека. Метод Pop используется для того, чтобы вывести первую строку из стека. Метод Peek используется для просмотра следующего элемента в стеке, а затем Pop метод используется для его отключения.

Метод ToArray используется для создания массива и копирования элементов стека в него, а затем массив передается конструктору Stack , который принимает IEnumerable , создавая копию стека с обратным порядком элементов. Отображаются элементы копии.

Создается массив, в два раза больше размера стека, и CopyTo метод используется для копирования элементов массива, начиная с середины массива. Конструктор Stack снова используется для создания копии стека с обратным порядком элементов. Таким образом, три элемента NULL находятся в конце.

Метод Contains используется, чтобы показать, что строка «четыре» находится в первой копии стека, после чего Clear метод очищает копию, а Count свойство показывает, что стек пуст.

using System; using System.Collections.Generic; class Example < public static void Main() < Stacknumbers = new Stack(); numbers.Push("one"); numbers.Push("two"); numbers.Push("three"); numbers.Push("four"); numbers.Push("five"); // A stack can be enumerated without disturbing its contents. foreach( string number in numbers ) < Console.WriteLine(number); >Console.WriteLine("\nPopping ''", numbers.Pop()); Console.WriteLine("Peek at next item to destack: ", numbers.Peek()); Console.WriteLine("Popping ''", numbers.Pop()); // Create a copy of the stack, using the ToArray method and the // constructor that accepts an IEnumerable. Stack stack2 = new Stack(numbers.ToArray()); Console.WriteLine("\nContents of the first copy:"); foreach( string number in stack2 ) < Console.WriteLine(number); >// Create an array twice the size of the stack and copy the // elements of the stack, starting at the middle of the // array. string[] array2 = new string[numbers.Count * 2]; numbers.CopyTo(array2, numbers.Count); // Create a second stack, using the constructor that accepts an // IEnumerable(Of T). Stack stack3 = new Stack(array2); Console.WriteLine("\nContents of the second copy, with duplicates and nulls:"); foreach( string number in stack3 ) < Console.WriteLine(number); >Console.WriteLine("\nstack2.Contains(\"four\") = ", stack2.Contains("four")); Console.WriteLine("\nstack2.Clear()"); stack2.Clear(); Console.WriteLine("\nstack2.Count = ", stack2.Count); > > /* This code example produces the following output: five four three two one Popping 'five' Peek at next item to destack: four Popping 'four' Contents of the first copy: one two three Contents of the second copy, with duplicates and nulls: one two three stack2.Contains("four") = False stack2.Clear() stack2.Count = 0 */ 
open System open System.Collections.Generic let numbers = Stack() numbers.Push "one" numbers.Push "two" numbers.Push "three" numbers.Push "four" numbers.Push "five" // A stack can be enumerated without disturbing its contents. for number in numbers do printfn $"" printfn $"\nPopping ''" printfn $"Peek at next item to destack: " numbers.Peek() |> ignore printfn $"Popping ''" // Create a copy of the stack, using the ToArray method and the // constructor that accepts an IEnumerable. let stack2 = numbers.ToArray() |> Stack printfn "\nContents of the first copy:" for number in stack2 do printfn $"" // Create an array twice the size of the stack and copy the // elements of the stack, starting at the middle of the // array. let array2 = numbers.Count * 2 |> Array.zeroCreate numbers.CopyTo(array2, numbers.Count) // Create a second stack, using the constructor that accepts an // IEnumerable(Of T). let stack3 = Stack array2 printfn "\nContents of the second copy, with duplicates and nulls:" for number in stack3 do printfn $"" printfn $""" stack2.Contains "four" = """ printfn "\nstack2.Clear()" stack2.Clear() printfn $"\nstack2.Count = " // This code example produces the following output: // five // four // three // two // one // // Popping 'five' // Peek at next item to destack: four // Popping 'four' // // Contents of the first copy: // one // two // three // // Contents of the second copy, with duplicates and nulls: // one // two // three // // stack2.Contains("four") = False // // stack2.Clear() // // stack2.Count = 0 
Imports System.Collections.Generic Module Example Sub Main Dim numbers As New Stack(Of String) numbers.Push("one") numbers.Push("two") numbers.Push("three") numbers.Push("four") numbers.Push("five") ' A stack can be enumerated without disturbing its contents. For Each number As String In numbers Console.WriteLine(number) Next Console.WriteLine(vbLf & "Popping ''", numbers.Pop()) Console.WriteLine("Peek at next item to pop: ", _ numbers.Peek()) Console.WriteLine("Popping ''", numbers.Pop()) ' Create another stack, using the ToArray method and the ' constructor that accepts an IEnumerable(Of T). Note that ' the order of items on the new stack is reversed. Dim stack2 As New Stack(Of String)(numbers.ToArray()) Console.WriteLine(vbLf & "Contents of the first copy:") For Each number As String In stack2 Console.WriteLine(number) Next ' Create an array twice the size of the stack, compensating ' for the fact that Visual Basic allocates an extra array ' element. Copy the elements of the stack, starting at the ' middle of the array. Dim array2((numbers.Count * 2) - 1) As String numbers.CopyTo(array2, numbers.Count) ' Create a second stack, using the constructor that accepts an ' IEnumerable(Of T). The elements are reversed, with the null ' elements appearing at the end of the stack when enumerated. Dim stack3 As New Stack(Of String)(array2) Console.WriteLine(vbLf & _ "Contents of the second copy, with duplicates and nulls:") For Each number As String In stack3 Console.WriteLine(number) Next Console.WriteLine(vbLf & "stack2.Contains(""four"") = ", _ stack2.Contains("four")) Console.WriteLine(vbLf & "stack2.Clear()") stack2.Clear() Console.WriteLine(vbLf & "stack2.Count = ", _ stack2.Count) End Sub End Module ' This code example produces the following output: ' 'five 'four 'three 'two 'one ' 'Popping 'five' 'Peek at next item to pop: four 'Popping 'four' ' 'Contents of the first copy: 'one 'two 'three ' 'Contents of the second copy, with duplicates and nulls: 'one 'two 'three ' ' ' ' 'stack2.Contains("four") = False ' 'stack2.Clear() ' 'stack2.Count = 0 

Комментарии

CountДля параметра задается значение ноль, а ссылки на другие объекты из элементов коллекции также освобождаются.

Этот метод является операцией O( n ), где n имеет значение Count.

Как очистить стек?

3 ноября 2014 г. Просмотров: 3514

Одним из типов структур данных, достаточно широко используемых сегодня в прикладном программировании, является стек. Его особенностью является принцип организации элементов, при котором их добавление и удаление возможно только по одному и только через «вершину», то есть по принципу LIFO. Но иногда бывает необходимо очистить сразу весь стек.

Вам понадобится
  • — текстовый редактор или IDE;
  • — транслятор с используемого языка программирования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *