Стек: классы Stack и Stack
Стек (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();
}
}
}
Комментарии