Введение

В этом уроке ты
  • Узнаешь, что такое стек.
  • Научишься использовать стек в своем языке программирования.
  • Познакомишься с основными операциями стека.
Что такое стек

Представь, что перед приходом гостей тебе нужно достать все тарелки из коробки и разложить их на столе. Ты будешь брать самую верхнюю тарелку и класть её на стол. А после ужина, складывая тарелки обратно в коробку, ты будешь класть каждую следующую тарелку сверху на предыдущие.

Эта ситуация очень похожа на работу структуры данных, которая называется стек.

Стек — это структура данных, в которой новые элементы добавляются наверх (в конец), а удаляются тоже только с самого верха. Такая схема называется LIFO (Last In, First Out — последний вошёл, первый вышел).

Кроме добавления и удаления элементов, стек поддерживает ещё несколько операций:

  • push — добавление элемента в вершину стека.
  • pop — удаление элемента с вершины стека.
  • top — просмотр последнего элемента (без удаления).
  • size — получение размера стека.
Операция Время Память
push O(1) O(1)
top O(1) O(1)
pop O(1) O(1)
size O(1) O(1)
Построение из массива O(n) O(n)
Анатомия стека

Самый последний элемент стека называется вершиной, а операцию добавления элемента часто называют push (от англ. «толкать» или «класть»).

Вот пример того, как это может звучать в разговоре программистов: «...нужно просто пушить очередной элемент и сравнивать вершину с максимальным значением...».

Стек в программировании

При работе со стеком доступен только самый верхний (последний добавленный) элемент. Чтобы получить доступ к элементам, находящимся ниже, нужно последовательно удалять элементы сверху.

Стек можно реализовать разными способами, и в каждом языке программирования есть свои подходы.

Несмотря на различные способы реализации, любая структура, используемая как стек, должна поддерживать операции вставки, удаления, просмотра последнего элемента и определения размера с одинаковой скоростью выполнения — O(1).

using System;

class Solution
{
    static void Main()
    {
        
        // создаём стек
        Stack<string> stack = new Stack<string>();

        // добавляем два элемента
        stack.Push("первый");
        stack.Push("второй");

        // удаляем элемент с вершины
        stack.Pop();

        // получаем текущую вершину и длину стека
        string top = stack.Peek();
        int length = stack.Count;

        Console.WriteLine($"Вершина стека: {top}");  // выведет "первый"
        Console.WriteLine($"Длина стека: {length}"); // выведет 1
    }
}
Кратко о главном
  1. Стек — это структура данных, поддерживающая операции вставки элемента в конец (push), удаление верхнего элемента (pop), просмотр последнего элемента (top) и получение размера (size). Все эти операции работают за O(1).
  2. При работе с классическим стеком ты можешь взаимодействовать только с последним элементом. Доступ к элементам, находящимся ниже, возможен только после удаления всех элементов, которые находятся выше.
  3. В некоторых языках программирования нет специальной структуры «стек», поэтому используется дек(deque).
Что дальше?

Скорее переходи к следующему уроку, где мы разберём задачу с собеседования, в решении которой применяется стек!