Стек Stack в C#
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Стек — это структура данных (коллекция, последовательность), содержащая один или несколько элементов одного типа и работающая по принципу LIFO («last in — first out», «последний вошел — первый вышел»).
В C# стек представляет класс обобщенный класс Stack . Вывод элементов стека происходит в обратном порядке (принцип LIFO), в то время, как используя очередь ( Queue ) вывод элементов происходит в прямом порядке (первый вошел — первый вышел), а, используя список List , мы можем организовать вывод в любом удобном для нас порядке.
Примеров использования стеков в реальной жизни можно придумать массу — стопка книг, тарелок и так далее. Например, если перед нами стоит стопка тарелок, то, чтобы достать самую нижнюю тарелку (она у нас в стопку попала первой), нам необходимо сначала убрать все тарелки над ней (те, которые были перед ней — последние).
Создание стека в C#
Для создания стека в C# мы можем воспользоваться следующими конструкторами:
Создание пустого стека:
Создание пустого стека заданной емкости:
Stack stack2 = new Stack(10);
здесь мы создали стек с начальной емкостью в десять элементов.
Создание стека из коллекции:
int[] array = new int[] < 1, 2, 3, 4, 5 >; Stack stack3 = new Stack(array);
здесь мы создали стек, используя обычный одномерный массив. В этот конструктор можно передавать любые объекты, реализующие интерфейс IEnumerable . О том, как реализовать такой интерфейс в своей программе — читайте эту статью.
Методы стека
В таблице ниже представлены основные методы класса Stack
Clear() | Удаляет все объекты из Stack . |
Contains(T) | Определяет, входит ли элемент в коллекцию Stack . |
Copy To(T[], Int32) | Копирует Stack в существующий одномерный массив Array , начиная с указанного индекса массива. |
Peek() | Возвращает объект, находящийся в начале Stack , без его удаления. |
Pop() | Удаляет и возвращает объект, находящийся в начале Stack . |
Push(T) | Вставляет объект как верхний элемент стека Stack . |
To Array() | Копирует Stack в новый массив. |
Trim Excess() | Устанавливает емкость равной фактическому количеству элементов в Stack , если это количество составляет менее 90 процентов текущей емкости. |
Пример работы со стеком в C#
Рассмотрим простой пример работы со стеком в C#, показывающий использование различных методов класса Stack
using System; using System.Collections.Generic; namespace ConsoleApp7 < internal class Program < static void Main(string[] args) < Stackstack = new Stack(3); //создаем стек с начальной емкостью на 3 элемента Console.WriteLine($"Количество элементов коллекции "); //добавляем новые элементы в стек stack.Push(1); stack.Push(2); stack.Push(3); stack.Push(4);//на этом шаге емкость хранилища будет увеличена stack.Push(5); while (stack.Count > 0) < if (stack.Peek() == 3) < Console.WriteLine($"Нашли в стеке значение 3. Всего элементов "); > Console.WriteLine($"Извлекли из стека значение . Всего элементов "); > > > >
Результат работы приложения будет следующий:
Количество элементов коллекции 0
Извлекли из стека значение 5. Всего элементов 4
Извлекли из стека значение 4. Всего элементов 3
Нашли в стеке значение 3. Всего элементов 3
Извлекли из стека значение 3. Всего элементов 2
Извлекли из стека значение 2. Всего элементов 1
Извлекли из стека значение 1. Всего элементов 0
Итого
Сегодня мы рассмотрели реализацию ещё одной структуры данных в C# — стек. Стек работает по принципу LIFO — последний добавленный элемент выводится (удаляется) из коллекции первым.
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Stack Класс
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет простую неуниверсальную коллекцию объектов, работающую по принципу «последним поступил — первым обслужен».
public ref class Stack : System::Collections::ICollection
public ref class Stack : ICloneable, System::Collections::ICollection
public class Stack : System.Collections.ICollection
public class Stack : ICloneable, System.Collections.ICollection
[System.Serializable] public class Stack : ICloneable, System.Collections.ICollection
[System.Serializable] [System.Runtime.InteropServices.ComVisible(true)] public class Stack : ICloneable, System.Collections.ICollection
type Stack = class interface ICollection interface IEnumerable
type Stack = class interface ICollection interface IEnumerable interface ICloneable
[] type Stack = class interface ICollection interface IEnumerable interface ICloneable
[] [] type Stack = class interface ICollection interface IEnumerable interface ICloneable
[] [] type Stack = class interface ICollection interface ICloneable interface IEnumerable
Public Class Stack Implements ICollection
Public Class Stack Implements ICloneable, ICollection
Примеры
В следующем примере показано, как создавать и добавлять значения в стек и отображать их значения.
using namespace System; using namespace System::Collections; void PrintValues( IEnumerable^ myCollection ); int main() < // Creates and initializes a new Stack. Stack^ myStack = gcnew Stack; myStack->Push( "Hello" ); myStack->Push( "World" ); myStack->Push( "!" ); // Displays the properties and values of the Stack. Console::WriteLine( "myStack" ); Console::WriteLine( "\tCount: ", myStack->Count ); Console::Write( "\tValues:" ); PrintValues( myStack ); > void PrintValues( IEnumerable^ myCollection ) < IEnumerator^ myEnum = myCollection->GetEnumerator(); while ( myEnum->MoveNext() ) < Object^ obj = safe_cast(myEnum->Current); Console::Write( " ", obj ); > Console::WriteLine(); > /* This code produces the following output. myStack Count: 3 Values: ! World Hello */
using System; using System.Collections; public class SamplesStack < public static void Main() < // Creates and initializes a new Stack. Stack myStack = new Stack(); myStack.Push("Hello"); myStack.Push("World"); myStack.Push("!"); // Displays the properties and values of the Stack. Console.WriteLine( "myStack" ); Console.WriteLine( "\tCount: ", myStack.Count ); Console.Write( "\tValues:" ); PrintValues( myStack ); > public static void PrintValues( IEnumerable myCollection ) < foreach ( Object obj in myCollection ) Console.Write( " ", obj ); Console.WriteLine(); > > /* This code produces the following output. myStack Count: 3 Values: ! World Hello */
Imports System.Collections Public Class SamplesStack Public Shared Sub Main() ' Creates and initializes a new Stack. Dim myStack As New Stack() myStack.Push("Hello") myStack.Push("World") myStack.Push("!") ' Displays the properties and values of the Stack. Console.WriteLine("myStack") Console.WriteLine(ControlChars.Tab & "Count: ", myStack.Count) Console.Write(ControlChars.Tab & "Values:") PrintValues(myStack) End Sub Public Shared Sub PrintValues(myCollection As IEnumerable) Dim obj As [Object] For Each obj In myCollection Console.Write(" ", obj) Next obj Console.WriteLine() End Sub End Class ' This code produces the following output. ' ' myStack ' Count: 3 ' Values: ! World Hello
Комментарии
Емкость a Stack — это количество элементов, которые Stack могут храниться. При добавлении элементов к объекту Stackемкость автоматически увеличивается по мере необходимости путем перераспределения.
Мы не рекомендуем использовать класс для новой разработки Stack . Вместо этого рекомендуется использовать универсальный System.Collections.Generic.Stack класс. Дополнительные сведения см. в разделе неуниверсийные коллекции не следует использовать в GitHub.
Если Count емкость стека меньше емкости, Push выполняется O(1) операция. Если емкость должна быть увеличена для размещения нового элемента, Push становится операцией O(n) , где n находится Count. Pop O(1) — это операция.
Stack принимает null в качестве допустимого значения и позволяет дублировать элементы.
Конструкторы
Инициализирует новый экземпляр класса Stack, который является пустым и имеет начальную емкость по умолчанию.
Инициализирует новый экземпляр класса Stack, который содержит элементы, скопированные из указанной коллекции, и обладает начальной емкостью, равной количеству скопированных элементов.
Инициализирует новый экземпляр Stack, который является пустым и обладает указанной начальной емкостью или емкостью по умолчанию, в зависимости от того, какое значение больше.
Свойства
Получает число элементов, содержащихся в интерфейсе Stack.
Возвращает значение, показывающее, является ли доступ к коллекции Stack синхронизированным (потокобезопасным).
Получает объект, с помощью которого можно синхронизировать доступ к коллекции Stack.
Методы
Определяет, входит ли элемент в коллекцию Stack.
Копирует Stack в существующий одномерный Array, начиная с указанного индекса массива.
Определяет, равен ли указанный объект текущему объекту.
Служит хэш-функцией по умолчанию.
Возвращает объект Type для текущего экземпляра.
Создает неполную копию текущего объекта Object.
Возвращает объект, находящийся в начале Stack, без его удаления.
Удаляет и возвращает объект, находящийся в начале Stack.
Вставляет объект как верхний элемент стека Stack.
Возвращает синхронизированную (потокобезопасную) оболочку коллекции Stack.
Возвращает строку, представляющую текущий объект.
Методы расширения
Приводит элементы объекта IEnumerable к заданному типу.
Выполняет фильтрацию элементов объекта IEnumerable по заданному типу.
Позволяет осуществлять параллельный запрос.
Преобразовывает коллекцию IEnumerable в объект IQueryable.
Применяется к
Потокобезопасность
Открытые статические ( Shared в Visual Basic) члены этого типа являются потокобезопасными. Потокобезопасная работа с членами экземпляров типа не гарантируется.
Чтобы гарантировать безопасность Stackпотока, все операции должны выполняться с помощью оболочки, возвращаемой методом Synchronized(Stack) .
Перечисление коллекции не является потокобезопасной процедурой. Даже если коллекция синхронизирована, другие потоки могут ее изменить, что приведет к тому, что перечислитель создаст исключение. Для обеспечения потокобезопасности при перечислении можно либо заблокировать коллекцию на все время перечисления, либо перехватывать исключения, возникающие в результате изменений, внесенных другими потоками.
Методы стека си шарп
Класс Stack представляет коллекцию, которая использует алгоритм LIFO («последний вошел — первый вышел»). При такой организации каждый следующий добавленный элемент помещается поверх предыдущего. Извлечение из коллекции происходит в обратном порядке — извлекается тот элемент, который находится выше всех в стеке.
Стек — довольно часто встречаемая структура данных в реальной жизни. Банальные примеры стеков — стопка книг или тарелок, где каждую новую книгу или тарелку помещают поверх предыдущей. А извлекают из этой стопки книги/тарелки в обратном порядке — сначала самую верхнюю и так далее. Другой пример — одежда: допустим, человек выходит на улицу в зимнюю погоду и для этого сначала одевает майку, потом рубашку, затем свитер, и в конце куртку. Когда человек снимает с себя одежду — он делает это в обратном порядке: сначала снимает куртку, потом свитер и так далее.
Создание стека
Для создания стека можно использовать один из трех конструкторов. Прежде всего можно создать пустой стек:
При создании пустого стека можно указать емкость стека:
Stack people = new Stack(16);
Также можно инициализировать стек элементами из другой коллекции или массивом:
var employees = new List < "Tom", "Sam", "Bob" >; Stack people = new Stack(employees); foreach (var person in people) Console.WriteLine(person); Console.WriteLine(people.Count); // 3
Для перебора стека можно использовать стандартный цикл foreach . Причем в цикле в соответствии с аалгоритмом стека LIFO данные извлекаются в порядке, обратном их добавлению. Консольный вывод в данном случае:
Для получения количества элементов стека применяется свойство Count .
Методы Stack
В классе Stack можно выделить следующие методы:
- Clear : очищает стек
- Contains : проверяет наличие в стеке элемента и возвращает true при его наличии
- Push : добавляет элемент в стек в верхушку стека
- Pop : извлекает и возвращает первый элемент из стека
- Peek : просто возвращает первый элемент из стека без его удаления
var people = new Stack(); people.Push("Tom"); // people = < Tom >people.Push("Sam"); // people = < Sam, Tom >people.Push("Bob"); // people = < Bob, Sam, Tom >// получаем первый элемент стека без его удаления string headPerson = people.Peek(); Console.WriteLine(headPerson); // Bob string person1 = people.Pop(); // people = < Sam, Tom >Console.WriteLine(person1); // Bob string person2 = people.Pop(); // people = < Tom >Console.WriteLine(person2); // Sam string person3 = people.Pop(); // people = < >Console.WriteLine(person3); // Tom
Работу стека можно представить следующей иллюстрацией:
Стоит отметить, что если с помощью методов Peek или Pop мы попытаемся получить первый элемент стека, который пуст, то программа выдаст исключение. Соответственно перед получением элемента мы можем проверять количество элементов в стеке:
Либо можно использовать пару методов:
- bool TryPop(out T result) : удаляет из стека первый элемент и передает его в переменную result, возвращает true , если очередь не пуста и элемент успешно получен.
- bool TryPeek(out T result) : передает в переменную result первый элемент стека без его извлечения, возвращает true , если элемент успешно получен.
var people = new Stack(); people.Push("Tom"); // people = < Tom >// удаляем элементы var success1 = people.TryPop(out var person1); // success1 = true if (success1) Console.WriteLine(person1); // Tom var success2 = people.TryPeek(out var person2); // success2 = false if (success2) Console.WriteLine(person2);