std::stack в C++: полное руководство с практическими примерами
Что такое std::stack?
std::stack — адаптер контейнера, реализующий принцип LIFO (Last In, First Out — последний пришёл, первый ушёл). Он позволяет вставку и удаление элементов только с одного конца — вершины. По умолчанию в качестве базового контейнера используется std::deque, но можно указать любой последовательный контейнер (например, std::vector или std::list).
Адаптеры контейнеров не предоставляют итераторов, поэтому напрямую обойти стек нельзя. Взаимодействие происходит через функции-члены.
Цели обучения
- Определить
std::stackи понять его LIFO-поведение - Выучить синтаксис объявления стека
- Изучить типы-члены и ключевые операции
- Разобрать
push,pop,top,empty,size,emplace,swap - Реализовать стек в стандартной библиотеке шаблонов (STL)
Синтаксис
Подключите заголовочный файл <stack> и объявите стек шаблоном:
template<class T, class Container = std::deque<T>> class stack;
- T — тип элементов; любой допустимый тип C++, включая пользовательские классы.
- Container — базовый контейнер; по умолчанию
std::deque.
Типы-члены
value_type— тип элементаT.container_type— тип базового контейнера.size_type— беззнаковый целый для размера контейнера.
Основные операции
push()— добавить элемент на вершину.pop()— удалить верхний элемент.top()— доступ к вершине без удаления.empty()— проверка на пустоту.size()— количество элементов.emplace()— конструирует и вставляет элемент прямо на вершине.swap()— обменивает содержимое с другим стеком.
Обзор реализации
Ниже — визуальное представление операций стека (вершина отмечена стрелкой).

push() и pop()
Метод push() добавляет новый элемент, увеличивая размер на 1:
stack.push(value);
Метод pop() удаляет верхний элемент и уменьшает размер:
stack.pop();
Пример 1: Базовая манипуляция стеком
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
st.push(10);
st.push(20);
st.push(30);
st.push(40);
st.pop(); // удаляет 40
st.pop(); // удаляет 30
while (!st.empty()) {
cout << ' ' << st.top();
st.pop();
}
return 0;
}
Вывод: 20 10
empty(), size(), top()
Эти утилиты дают быструю информацию о состоянии стека.
Пример 2: Инспекция состояния стека
#include <iostream>
#include <stack>
using namespace std;
void display(stack<int> s) {
while (!s.empty()) {
cout << '\t' << s.top();
s.pop();
}
cout << '\n';
}
int main() {
stack<int> st;
st.push(32);
st.push(21);
st.push(39);
st.push(89);
st.push(25);
cout << "The stack st is: ";
display(st);
cout << "\n st.size() : " << st.size();
cout << "\n st.top() : " << st.top();
st.pop();
cout << "\n st after pop: ";
display(st);
return 0;
}
Вывод: показывает содержимое стека, размер, верхний элемент и состояние после pop.
emplace() и swap()
• emplace() конструирует элемент на месте, избегая лишнего копирования.
• swap() эффективно обменивает содержимое двух стеков.
Пример 3: Использование emplace() и swap()
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st1, st2;
st1.emplace(12);
st1.emplace(19);
st2.emplace(20);
st2.emplace(23);
st1.swap(st2);
cout << "st1 = ";
while (!st1.empty()) {
cout << st1.top() << " ";
st1.pop();
}
cout << endl << "st2 = ";
while (!st2.empty()) {
cout << st2.top() << " ";
st2.pop();
}
}
Вывод: демонстрирует содержимое стеков до и после обмена.
Использование std::stack в STL
Реализовать стек одной строкой:
std::stack<T> st;
Пример:
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
st.push(12);
st.push(19);
st.push(20);
cout << st.top(); // 20
cout << st.size(); // 3
return 0;
}
Резюме
std::stackреализует LIFO и даёт доступ только к вершинному элементу.- Это адаптер контейнера; базовый контейнер по умолчанию
std::deque, но может быть настроен. - Основные функции:
push,pop,top,empty,size,emplace,swap. - Стек — лёгкий, эффективный инструмент для сценариев, требующих временного хранения элементов.
Язык C
- Операторы в C++: типы, примеры и практические программы
- Цикл do-while в C++: синтаксис, примеры и вложенные циклы
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Динамическое выделение массивов в C++: практическое руководство с примерами кода
- Указатели в C++: концепции, примеры и практические применения
- Перегрузка операторов в C++: практическое руководство с примерами кода
- Структуры (struct) в C++: объяснение с практическим примером
- std::map в C++: полное руководство с примерами кода
- Освоение std::list в C++: синтаксис, функции и практические примеры
- Функции в C++: подробное объяснение с практическими примерами кода