Стек: классы Stack и Stack<T>

22

Стек (stack) — это контейнер, работающий по принципу "последний вошел, первый вышел" (last in, first out — LIFO). На рисунке показано представление стека, где метод Push() добавляет элемент, а метод Pop() — получает элемент, добавленный последним:

Стек

Класс коллекции, поддерживающий стек, носит название Stack. В нем реализуются интерфейсы ICollection, IEnumerable и ICloneable. Этот класс создает динамическую коллекцию, которая расширяется по мере потребности хранить в ней вводимые элементы. Всякий раз, когда требуется расширить такую коллекцию, ее емкость увеличивается вдвое.

В классе Stack определяются следующие конструкторы:

public Stack()
public Stack(int initialCapacity)
public Stack(ICollection col)

В первой форме конструктора создается пустой стек, во второй форме — пустой стек, первоначальный размер которого определяет первоначальная емкость, задаваемая параметром initialCapacity, и в третьей форме — стек, содержащий элементы указываемой коллекции col. Его первоначальная емкость равна количеству указанных элементов.

В классе Stack определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса приведены ниже. Эти методы обычно применяются следующим образом. Для того чтобы поместить объект на вершине стека, вызывается метод Push(). А для того чтобы извлечь и удалить объект из вершины стека, вызывается метод Pop(). Если же объект требуется только извлечь, но не удалить из вершины стека, то вызывается метод Peek(). А если вызвать метод Pop() или Peek(), когда вызывающий стек пуст, то сгенерируется исключение InvalidOperationException.

Класс Stack<T> является обобщенным эквивалентом класса необобщенной коллекции Stack. В нем поддерживается стек в виде списка, действующего по принципу "первым пришел — последним обслужен". В этом классе реализуются интерфейсы Collection, IEnumerable и IEnumerable<T>. Кроме того, в классе Stack<T> непосредственно реализуются методы Clear(), Contains() и СоруТо(), определенные в интерфейсе ICollection<T>. А методы Add() и Remove() в этом классе не поддерживаются, как, впрочем, и свойство IsReadOnly. Коллекция класса Stack<T> имеет динамический характер, расширяясь по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться.

Count

Свойство Count возвращает количество элементов в стеке.

Push()

Метод Push() добавляет элемент в вершину стека.

Pop()

Метод Pop() удаляет и возвращает элемент из вершины стека. Если стек пуст, генерируется исключение типа InvalidOperationException.

Peek()

Метод Peek() возвращает элемент из вершины стека, не удаляя его при этом.

Contains()

Метод Contains() проверяет наличие элемента в стеке и возвращает true в случае нахождения его там.

Давайте рассмотрим пример:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            var MyStack = new Stack<char>();
            MyStack.Push('A');
            MyStack.Push('N');
            MyStack.Push('X');

            Console.WriteLine("Исходный стек: ");
            foreach (char s in MyStack)
                Console.Write(s);
            Console.WriteLine("\n");

            while (MyStack.Count > 0)
            {
                Console.WriteLine("Pop -> {0}",MyStack.Pop());
            }

            if (MyStack.Count == 0)
                Console.WriteLine("\nСтек пуст!");

            Console.ReadLine();
        }
    }
}
Пример использования стека C#
Лучший чат для C# программистов