Стек — линейная структура данных, которая позволяет удалять только последний добавленный элемент. Можно представить себе стек в образе стопки книг: вы можете доложить или убрать только верхнюю книгу, а чтобы добраться, скажем, до третьей книги, сначала потребуется убрать все книги над ней.
Стек является примером структуры данных «последним вошел, первым вышел», или Last In — First Out (LIFO). Последним вошел, первым вышел —структура данных, в которой элемент, помещенный в структуру последним, является первым элементом, который выходит из нее. Поскольку вы можете получить доступ к содержимому стека лишь по одному элементу за другим, стек также является примером структуры данных с ограниченным доступом, которая вынуждает получать доступ к ее информации только в определенном порядке.
В стеке есть две главные операции: проталкивание (push) и выталкивание (pop). Push означает помещение в стек нового элемента. Pop — удаление из стека последнего элемента. У стеков также могут быть дополнительные операции, например считывание (peek). Peek — это просмотр верхнего элемента
стека без его удаления.
Основные операции:
push(item)
- добавление элемента на вершину стека (проталкивание)pop()
- удаление и возврат верхнего элемента (выталкивание)peek()
- просмотр верхнего элемента без удаленияis_empty()
- проверка на пустотуsize()
- получение размера стека
Сложности выполнения:
Сложность операций:
Операция | Реализация массивом | Связный список |
---|---|---|
push | O(1)* | O(1) |
pop | O(1) | O(1) |
peek | O(1) | O(1) |
search | O(n) | O(n) |
Пример кода:
class ArrayStack:
def __init__(self):
self.items = []
def push(self, item):
"""Добавление элемента на вершину стека"""
self.items.append(item)
def pop(self):
"""Удаление и возврат верхнего элемента"""
if self.is_empty():
raise IndexError('Удаление из пустого стека')
return self.items.pop()
def peek(self):
"""Просмотр верхнего элемента без удаления"""
if self.is_empty():
raise IndexError('Стек пуст')
return self.items[-1]
def is_empty(self):
"""Проверка на пустоту"""
return not self.items
def size(self):
"""Размер стека"""
return len(self.items)
def __str__(self):
"""Строковое представление"""
return f"Stack({self.items})"
# реализация стека через связные списки
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedStack:
def __init__(self):
self.head = None
self._size = 0
def push(self, data):
"""Добавление элемента на вершину стека"""
new_node = Node(data)
new_node.next = self.head
self.head = new_node
self._size += 1
def pop(self):
"""Удаление и возврат верхнего элемента"""
if self.is_empty():
raise IndexError('Удаление из пустого стека')
popped = self.head
self.head = self.head.next
self._size -= 1
return popped.data
def peek(self):
"""Просмотр верхнего элемента"""
if self.is_empty():
raise IndexError('Стек пуст')
return self.head.data
def is_empty(self):
"""Проверка на пустоту"""
return self.head is None
def size(self):
"""Размер стека"""
return self._size
def __str__(self):
"""Строковое представление"""
items = []
current = self.head
while current:
items.append(str(current.data))
current = current.next
return f"Stack({' -> '.join(items)})"