Стек в C++ STL с примером
Что такое std::stack?
Стек — это структура данных, работающая по принципу LIFO (Last In First Out). std::stack позволяет добавлять и удалять элементы только с одного конца.
Класс std::stack — это адаптер контейнера. Объекты-контейнеры содержат данные аналогичного типа. Вы можете создать стек из различных контейнеров последовательности. Если контейнер не указан, по умолчанию будет использоваться контейнер deque. Адаптеры контейнеров не поддерживают итераторы, поэтому их нельзя использовать для управления данными.
В этом руководстве по C++ вы узнаете
- Что такое std::stack?
- Синтаксис стека
- Типы участников
- Операции в стеке
- Реализация стека
- push() и pop()
- пустой(), размер(), верхний()
- emplace() и swap()
- Стек в STL
Синтаксис стека
Чтобы создать стек, мы должны включить заголовочный файл
template <class Type, class Container = deque<Type> > class stack;
- Тип – Тип элемента, содержащегося в std::stack. Это может быть любой допустимый тип C++ или даже пользовательский тип.
- Контейнер – Тип базового объекта-контейнера.
Типы участников
Вот типы элементов стека:
- value_type — первый параметр шаблона, T. Он обозначает типы элементов.
- container_type — второй параметр шаблона, Container. Он обозначает базовый тип контейнера.
- size_type – целочисленный тип без знака.
Операции в стеке
Стек C++ поддерживает следующие основные операции:
- push — добавляет/вталкивает элемент в стек.
- pop — удаляет/извлекает элемент из стека.
- Peek — возвращает верхний элемент стека, не удаляя его.
- isFull — проверяет, заполнен ли стек.
- isEmpty — проверяет, пуст ли стек.
Реализация стека
Шаг 1) Изначально у нас пустой стек. Вершина пустого стека устанавливается в -1.
Шаг 2) Далее мы поместили элемент 5 в стек. Вершина стека будет указывать на элемент 5.
Шаг 3) Далее мы запихнули элемент 50 в стек. Вершина стека сдвигается и указывает на элемент 50.
Шаг 4) Затем мы выполнили операцию извлечения, удалив верхний элемент из стека. Элемент 50 выталкивается из стека. Вершина стека теперь указывает на элемент 5.
push() и pop()
Функции stack::push() добавляют новый элемент в вершину стека. Размер стека увеличивается на 1 после вставки. Функция использует следующий синтаксис:
stack.push(value)
Значение — это элемент, который нужно вставить в стек.
Функция stack::pop() удаляет верхний элемент стека. Это самый новый элемент стека. Размер стека уменьшается на 1 после удаления. Вот синтаксис функции:
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(); st.pop(); while (!st.empty()) { cout << ' ' << st.top(); st.pop(); } }
Вывод:
Вот скриншот кода:
Пояснение кода:
- Включите файл заголовка iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка стека в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы, не вызывая его.
- Вызовите функцию main(). Логика программы должна быть добавлена в эту функцию.
- Создайте стек st для хранения целочисленных значений.
- Используйте функцию push(), чтобы вставить значение 10 в стек.
- Используйте функцию push(), чтобы вставить значение 20 в стек.
- Используйте функцию push(), чтобы вставить значение 30 в стек.
- Используйте функцию push(), чтобы вставить значение 40 в стек.
- Используйте функцию pop(), чтобы удалить верхний элемент из стека, то есть 40. Верхний элемент теперь становится 30.
- Используйте функцию pop(), чтобы удалить верхний элемент из стека, то есть 30. Верхний элемент теперь становится 20.
- Используйте цикл while и функцию empty(), чтобы проверить, НЕ пуст ли стек. ! является оператором НЕ.
- Печать текущего содержимого стека на консоли.
- Вызовите функцию pop() в стеке.
- Конец тела цикла while.
- Конец тела функции main().
пустой(), размер(), верхний()
Стеки имеют встроенные функции, которые можно использовать для экспериментов со стеком и его значениями. К ним относятся:
- empty() — проверяет, пуст стек или нет.
- size()- возвращает размер стека, то есть количество элементов в стеке.
- top() — доступ к элементу стека вверху.
Пример 2:
#include <iostream> #include <stack> using namespace std; void createStack(stack <int> mystack) { stack <int> ms = mystack; while (!ms.empty()) { cout << '\t' << ms.top(); ms.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: "; createStack(st); cout << "\n st.size() : " << st.size(); cout << "\n st.top() : " << st.top(); cout << "\n st.pop() : "; st.pop(); createStack(st); return 0; }
Вывод:
Вот скриншот кода:
Пояснение кода:
- Включите файл заголовка iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка стека в наш код, чтобы использовать его функции.
- Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
- Создайте функцию createStack, которую можно использовать для создания стека mystack. Стек будет содержать набор целых чисел.
- Начало тела функции createStack.
- Создайте экземпляр типа данных mystack и назовите его ms.
- Используйте цикл while и функцию empty(), чтобы проверить, пуст ли стек.
- Начало тела цикла while.
- Используйте функцию top(), хранящуюся в верхней части стека. Символ \t создаст новую вкладку.
- Используйте функцию pop(), чтобы удалить элемент в верхней части стека.
- Конец тела цикла while.
- Выведите пустую строку на консоль.
- Конец тела функции createStack.
- Вызовите функцию main(). Логика программы должна быть добавлена в тело функции main().
- Начало тела функции main().
- Создать объект стека ул.
- Используйте функцию push(), чтобы вставить элемент 32 в стек.
- Используйте функцию push(), чтобы вставить элемент 21 в стек.
- Используйте функцию push(), чтобы вставить элемент 39 в стек.
- Используйте функцию push(), чтобы вставить элемент 89 в стек.
- Используйте функцию push(), чтобы вставить элемент 25 в стек.
- Выведите текст на консоль.
- Вызовите функцию createStack, чтобы выполнить указанные выше операции вставки в стек.
- Распечатайте размер стека на консоли вместе с другим текстом.
- Напечатайте элемент в верхней части стека на консоли.
- Выведите текст на консоль.
- Удалить элемент в верхней части стека. Затем он вернет элементы, оставшиеся в стеке.
- Вызовите функцию createStack для выполнения вышеуказанных операций.
- Программа должна возвращать значение после успешного завершения.
- Конец тела функции main().
emplace() и swap()
Это другие встроенные функции стека:
- emplace() — создает, а затем вставляет новый элемент в начало стека.
- swap() — обменивает содержимое стека на содержимое другого стека.
Пример 3:
#include <iostream> #include <stack> #include <cstdlib> using namespace std; int main() { stack<int> st1; stack<int> 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(); } }
Вывод:
Вот скриншот кода:
Пояснение кода:
- Включите файл заголовка iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка стека в наш код, чтобы использовать его функции.
- Включите заголовочный файл cstdlib в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы, не вызывая его.
- Вызовите функцию main(). Логика программы будет добавлена в тело этой функции.
- Объявите стек с именем st1 для хранения целочисленных значений.
- Объявите стек с именем st2 для хранения целочисленных значений.
- Используйте функцию emplace(), чтобы вставить целое число 12 в стек с именем st1.
- Используйте функцию emplace(), чтобы вставить целое число 19 в стек с именем st1.
- Используйте функцию emplace(), чтобы вставить целое число 20 в стек с именем st2.
- Используйте функцию emplace(), чтобы вставить целое число 23 в стек с именем st2.
- Используйте функцию swap(), чтобы поменять местами содержимое двух стеков, st1 и st2. Содержимое стека st1 должно быть перемещено в стек st2. Содержимое стека st2 должно быть перемещено в стек st1.
- Выведите текст на консоль.
- Используйте оператор while и функцию empty(), чтобы проверить, не пуст ли стек st1.
- Распечатать содержимое стека st1 на консоли. « » добавляет пространство между элементами стека при печати их на консоли.
- Выполните функцию pop() в стеке st1, чтобы удалить верхний элемент.
- Конец тела оператора while.
- Выведите текст на консоль. Endl — это ключевое слово C++ для конечной строки. Он перемещает курсор мыши на следующую строку, чтобы начать печать оттуда.
- Используйте оператор while и функцию empty(), чтобы проверить, не пуст ли стек st2.
- Выведите содержимое стека st2 на консоль. « » добавляет пространство между элементами стека при печати их на консоли.
- Выполните функцию pop() в стеке st2, чтобы удалить верхний элемент.
- Конец тела оператора while.
- Конец тела функции main().
Стек в STL
STL (Стандартная библиотека шаблонов) поставляется с классами шаблонов, которые предоставляют общие структуры данных C++. Следовательно, стек также может быть реализован в STL. Мы просто включаем эту библиотеку в наш код и используем ее для определения стека.
stack<T> st;
Приведенный выше синтаксис объявляет стек st для элементов типа данных T.
Пример 3:
#include <iostream> #include <stack> #include <cstdlib> using namespace std; int main() { stack<int> st; st.push(12); st.push(19); st.push(20); cout << st.top(); cout << st.size(); }
Вывод:
Вот скриншот кода:
Пояснение кода:
- Включите файл заголовка iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка стека в наш код, чтобы использовать его функции.
- Включите заголовочный файл cstdlib в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы, не вызывая его.
- Вызовите функцию main(). Логика программы должна быть добавлена в тело этой функции.
- Объявите стек st для хранения целочисленных данных.
- Добавить элемент 12 в стек.
- Добавить элемент 19 в стек.
- Добавить элемент 20 в стек.
- Напечатайте элемент в верхней части стека на консоли.
- Распечатайте размер стека на консоли.
- Конец тела функции main().
Обзор:
- Стек — это структура данных, работающая по принципу LIFO (последним пришел — первым ушел).
- Стандарт std::stack позволяет добавлять и удалять элементы только с одного конца.
- Класс std::stack представляет собой адаптер контейнера, содержащий элементы данных аналогичного типа.
- Стек можно создать из различных контейнеров последовательности.
- Если вы не укажете контейнер, по умолчанию будет использоваться контейнер deque.
- Функция push() предназначена для вставки элементов в стек.
- Функция pop() предназначена для удаления верхнего элемента из шага.
- Функция empty() предназначена для проверки того, пуст стек или нет.
Язык C
- Операторы в C++ с примером:что такое, типы и программы
- Цикл C++ do…while с примерами
- Оператор C++ Switch Case с ПРИМЕРОМ
- C++ динамическое выделение массивов с примером
- Указатели C++ с примерами
- Перегрузка оператора C++ с примерами
- Структура С++ с примером
- Карта в стандартной библиотеке шаблонов C++ (STL) с примером печати
- std::list в C++ с примером
- Функции C++ с примерами программ