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

Ключевые вопросы параграфа

  • Что такое стек и как он устроен?
  • Какие операции поддерживает стек и какова их сложность?
  • Где и как стек применяется в алгоритмах и повседневных задачах?

Определение стека

Стек (stack) — структура данных, которая работает по принципу «последним пришёл, первым ушёл» (LIFO — last in, first out). Стек можно представить как некий контейнер, в котором элементы (например, числа, символы и так далее) могут быть добавлены в вершину, а затем извлечены только из вершины. В бытовом плане стек напоминает стопку тарелок. Тарелка, которую положили первой, в самый низ, будет использована последней.

algorithms

Существуют различные реализации стека. Например, стек может быть реализован на массиве, на односвязном списке, на двусвязном списке и так далее. В параграфе будем говорить о реализации стека на односвязном списке.

Основные операции, которые можно производить со стеком, включают:

  • Добавление элемента в вершину стека (push) — .
  • Удаление элемента из вершины стека (pop) — .
  • Возврат верхнего элемента без его удаления (peek) — .
  • Проверка стека на пустоту (isEmpty) — .

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

Каждый раз, когда в стек добавляется новый элемент, указатель на вершину смещается на следующий элемент. Когда элемент удаляется из вершины стека, указатель смещается на предыдущий элемент. Если указатель находится в конце стека, то стек пуст.

Что дальше

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

Далее — структура, которая позволяет не просто сохранять элементы, а учитывать их приоритет. Вы узнаете, как работает очередь с приоритетом и где она применяется в реальных алгоритмах.

А пока вы не ушли дальше — закрепите материал на практике:

  • Отметьте, что урок прочитан, при помощи кнопки ниже.

  • Пройдите мини-квиз, чтобы проверить, насколько хорошо вы усвоили тему.

  • Перейдите к задачам этого параграфа и потренируйтесь.

  • Перед этим — загляните в короткий гайд о том, как работает система проверки.

Хотите обсудить, задать вопрос или не понимаете, почему код не работает? Мы всё предусмотрели — вступайте в сообщество Хендбука! Там студенты помогают друг другу разобраться.

Ключевые выводы параграфа

  • Стек — структура данных, работающая по принципу LIFO («последним пришёл — первым вышел»).
  • Основные операции: добавление (push), удаление (pop) и просмотр верхнего элемента (peek) — выполняются за O(1).
  • Стек удобен для задач со вложенной структурой: проверка корректности скобок в выражениях (каждая открывающая должна иметь соответствующую закрывающую); поддержка рекурсии (системный стек вызовов); откат действий в редакторах и программах.
  • Прост в реализации и широко используется в парсерах, алгоритмах обхода графов и обработке выражений.
Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Предыдущий параграф2.4. Дек
Следующий параграф2.6. Очередь с приоритетом