Стек и очередь - это фундаментальные абстрактные типы данных (АТД), которые широко используются в программировании. Они различаются принципами доступа к элементам.
Определение:
Структура данных, работающая по принципу LIFO (Last In, First Out - "последним пришел, первым вышел").
#include <stack>
std::stack<int> s;
s.push(10); // [10]
s.push(20); // [10, 20]
int top = s.top(); // 20
s.pop(); // [10]
Стек можно реализовать на массиве или односвязном списке:
class ArrayStack {
int* data;
int capacity;
int topIndex;
public:
void push(int item) {
if (topIndex == capacity - 1) resize();
data[++topIndex] = item;
}
int pop() {
if (isEmpty()) throw std::runtime_error("Stack underflow");
return data[topIndex--];
}
// ... другие методы
};
Определение:
Структура данных, работающая по принципу FIFO (First In, First Out - "первым пришел, первым вышел").
#include <queue>
std::queue<int> q;
q.push(10); // [10]
q.push(20); // [10, 20]
int front = q.front(); // 10
q.pop(); // [20]
Очередь можно реализовать на массиве (кольцевом буфере) или связном списке:
class ListQueue {
struct Node {
int data;
Node* next;
};
Node* head;
Node* tail;
public:
void enqueue(int item) {
Node* newNode = new Node{item, nullptr};
if (isEmpty()) head = tail = newNode;
else tail = tail->next = newNode;
}
int dequeue() {
if (isEmpty()) throw std::runtime_error("Queue underflow");
int item = head->data;
Node* temp = head;
head = head->next;
delete temp;
return item;
}
// ... другие методы
};
Характеристика | Стек | Очередь |
---|---|---|
Принцип работы | LIFO | FIFO |
Операции | push/pop | enqueue/dequeue |
Сложность операций | O(1) | O(1) |
Типичное применение | Вызов функций | Обработка задач |
std::stack
, std::queue
) в STL