Шаг 298.
Язык программирования C#. Начала.
Немного о разном. Знакомство с коллекциями (продолжение)

    На этом шаге мы рассмотрим создание и работу со стеком и очередью.

    Есть и другие классы, предназначенные для работы с коллекциями. Например, классы Stack и Queue предназначены для создания стека и очереди соответственно.


Стек - это последовательность элементов, которые обрабатываются по принципу "последний зашел - первый вышел": первым обрабатывается элемент, добавленный последним в стек. Очередь - это последовательность элементов, которые обрабатываются по принципу "первый зашел - первый вышел": первым обрабатывается элемент, который добавлялся в очередь первым.

    Классы Stack и Queue реализуют интерфейсы ICollection, IEnumerable и ICloneable. При работе со стеком для добавления элемента в стек используется метод Push(). С помощью метода Pop() из стека извлекается (удаляется) последний элемент, а значение элемента возвращается результатом метода. При работе с очередью новый элемент в очередь можно добавить с помощью метода Enqueue(). Метод Dequeue() извлекает (удаляет) первый элемент из очереди и результатом возвращает значение этого элемента. У классов Stack и Queue также есть метод Peek(), который результатом возвращает последний элемент для стека и первый элемент для очереди. При этом элемент из стека/очереди не удаляется.


Методы Peek(), Pop() и Dequeue() результатом возвращают объектные ссылки класса Object.

    Пример использования классов Stack и Queue представлен в примере ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Collections;

namespace pr298_1
{
    // Главный класс:
    class Program
    {
        // Метод для отображения содержимого коллекции: 
        static void show(ICollection s)
        {
            Console.WriteLine("Содержимое коллекции:"); 
            foreach (object obj in s)
            {
                Console.Write("|" + obj);
            }
            Console.WriteLine("|");
        }
        // Главный метод:
        static void Main()
        {
            // Создание стека:
            Stack mystack = new Stack();
            // Добавление элементов в стек: 
            mystack.Push("Первый"); 
            mystack.Push("Bтopoй"); 
            mystack.Push("Третий");
            // Отображение содержимого стека: 
            show(mystack);
            // Считывание элемента из стека: 
            Console.WriteLine("Прочитано: " + mystack.Peek()); 
            // Отображение содержимого стека: 
            show(mystack);
            // Извлечение элемента из стека: 
            Console.WriteLine("Извлечено: " + mystack.Pop()); 
            // Отображение содержимого стека: 
            show(mystack);
            // Создание очереди:
            Queue myqueue = new Queue();
            // Добавление элементов в очередь: 
            myqueue.Enqueue("Один"); 
            myqueue.Enqueue("Два"); 
            myqueue.Enqueue("Три");
            // Отображение содержимого очереди: 
            show(myqueue);
            // Считывание элемента из очереди:
            Console.WriteLine("Прочитано: " + myqueue.Peek());
            // Отображение содержимого очереди: 
            show(myqueue);
            // Извлечение элемента из очереди:
            Console.WriteLine("Извлечено: " + myqueue.Dequeue());
            // Отображение содержимого очереди: 
            show(myqueue);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы представлен ниже:


Рис.1. Результат работы приложения

    В программе описан статический метод show(), который предназначен для отображения содержимого коллекции, переданной аргументом методу. Аргумент метода описан как относящийся к типу ICollection. В этом случае мы учли, что классы Stack и Queue реализуют интерфейс ICollection, и поэтому объекты этих классов могут передаваться методу в качестве аргумента.

    В методе Main() создаются стек (команда

  Stack mystack = new Stack();
) и очередь (команда
  Queue myqueue = new Queue();
). В стек и очередь сначала добавляются элементы, после чего отображается содержимое соответствующей коллекции. Затем элемент считывается с помощью метода Peek(). При этом элемент из коллекции не удаляется. При извлечении элемента с помощью метода Pop() для стека и Dequeue() для очереди элемент удаляется из коллекции.


При попытке получить элемент из стека или очереди, в которой нет элементов, генерируется исключение класса InvalidOperationException.

    На следующем шаге мы рассмотрим ассоциативные коллекции.




Предыдущий шаг Содержание Следующий шаг