Стек (структура от данни) — как работи, принцип LIFO и основни операции

Научете как работи стекът (LIFO): основни операции push/pop, peek, приложения и примери. Ясни обяснения и практичен код за бързо усвояване.

Автор: Leandro Alegsa

Стекът е една от най-важните структури от данни в информатиката. За да разберете как работи стекът, представете си тесте карти за игра, което е обърнато с лицето надолу. Можем лесно да получим достъп само до картата, която е отгоре. Когато искаме да разгледаме горната карта, можем да направим две неща: можем да надникнем в нея, но да я оставим на купчината, или можем да я откъснем. Когато отскачаме от най-горния обект, ние го сваляме от купчината. Ако искаме да добавим още една карта към върха на купчината, избутваме я.

Стекът се нарича колекция от типа "последен влязъл - първи излязъл" (LIFO). Това означава, че последното нещо, което сме добавили (избутали), е първото, което се изважда (изскача). Ако последната карта, която сме сложили в купчината карти, е асо, то първата карта, която сме извадили отгоре, е същото асо.

Основни операции

  • push(x) — добавя елемент x на върха на стека.
  • pop() — премахва и връща елемента от върха. Ако стекът е празен — възниква подстек (underflow) или се връща специална стойност/изключение.
  • peek() или top() — връща елемента на върха без да го премахва.
  • isEmpty() — проверява дали стекът е празен.
  • size() — връща броя на елементите в стека.

Примерна имплементация (псевдокод)

Много имплементации са прости и интуитивни. Ето два основни подхода:

  • Масивно-базиран стек
    Използва масив и индекс top.
    push(x): if top == capacity-1 then resize() else top++; array[top]=x
    pop(): if top == -1 then error else x=array[top]; top--; return x
    peek(): if top == -1 then error else return array[top]
  • Свързан стек (с единично свързан списък)
    Използва връх (head). Всеки нов елемент става новият head.
    push(x): node.next = head; head = node
    pop(): if head == null then error else x = head.value; head = head.next; return x

Времева и пространствена сложност

  • Операции push, pop и peek обикновено са O(1) — изпълняват се константно време.
  • Пространството е O(n), където n е броят съхранявани елементи. При масивната имплементация може да има периодично пренасочване при resize (амортизирана O(1) за push).

Типични приложения и случаи на използване

  • Системен стек за повиквания на функции (call stack) — съхранява локални променливи и адреси за връщане.
  • Отмяна/възстановяване (undo/redo) в редактори.
  • Парсинг и проверка на правилно вложени скоби и изрази.
  • Изчисляване на изрази (инфикс → постфикс) и оценяване на постфиксни изрази.
  • Алгоритми за обхождане като DFS (depth-first search).
  • Решаване на проблеми с backtracking (напр. лабиринти, комбинаторни задачи).

Чести проблеми и предпазни мерки

  • Underflow (изваждане от празен стек) — винаги проверявайте isEmpty() преди pop().
  • Overflow (пълен стек при фиксирана масивна имплементация) — предвидете динамично разширяване или проверка за капацитет.
  • Синхронизация в мултнишови среди — ако множество нишки достъпват един и същи стек, е нужна синхронизация или използване на lock-free/конкурентни структури.

Съвети за практическо използване

  • За лесно дебъгване визуализирайте съдържанието на стека от дъното към върха.
  • Избирайте имплементация според изискванията: масив е по-бърз и ефективен по памет при предвидим капацитет; свързан списък е гъвкав при чести добавяния и премахвания с неизвестен горен брой елементи.
Две действия върху стека: push и pop.Zoom
Две действия върху стека: push и pop.

История

Коминът е предложен за първи път през 1955 г., а след това патентован през 1957 г. от германеца Фридрих Л. Бауер. По същото време същата концепция е разработена независимо от австралиеца Чарлз Леонард Хамблин.

Други операции

В съвременните компютърни езици стекът обикновено се реализира с повече операции от "push" и "pop". Някои реализации имат функция, която връща текущата дължина на стека. Друга типична помощна операция е "top" (известна също като "peek"), която може да върне текущия горен елемент на стека, без да го премахва. Друга често срещана операция е "dup", която прави копие на елемента в горната част на стека.

Свързани страници

  • Машина за подреждане


обискирам
AlegsaOnline.com - 2020 / 2025 - License CC3