STL. Stack. Адаптеры контейнеров.
Stack не является самостоятельным контейнером, он лишь может модифицировать ПРАВИЛА обращения к памяти для других контейнеров:
Как известно стек – структура памяти, при которой новые элементы могут добавляться лишь в конце имеющихся данных.
А например в списки мы можем добавлять данные и в начало и в середину и в конец.
НО объединив контейнер списка с адаптером стека мы получим список, в котором элементы можно добавлять лишь в конец.
Т.е. стек ограничит функционал базового контейнера, что положен в их основу (вектор/лист) правилами стека.
Для работы со стеком необходимо подключить библиотеку
#include <stack>
Stack входит в пространство имен std, поэтому или пишем std:: или используем пространство имен using namespace std;
stack MyStack;
MyStack.push(1); //добавляем элемент путем создания и копирования
MyStack.emplace(2); //добавляем элемент путем создания БЕЗ копирования
MyStack.emplace(3); //добавляем элемент путем создания БЕЗ копирования
MyStack.pop(); //удаляет ПОСЛЕДНИЙ элемент т.е. 3
MyStack.size(); //число элементов внутри стека
MyStack.top(); //возвращает ссылку на последний элемент
cout<<MyStack.top()<<endl; //выведет число 2 (т.к. 3 удалили)
stack<int, list<int>> MyStackList; //создаем стек для данных типа int, организация памяти по шаблону двусвязного списка
По сути – мы создаем стек, внутри которого находится список, который хранит данные типа int.
Адаптер стек организуем обращение к данным типа int по правилам стека.
В зависимости от используемого контейнера может изменяться быстродействие в тех или иных операциях.
Циклом перебрать элементы стека нельзя, т.к. мы можем взаимодействовать лишь с последним элементом. Итераторы со стеком не работают!!!
Посмотреть все элементы стека можно лишь выводя (метод .top) и потом удаляя (метод .pop) ПОСЛЕДНИЙ элемент.
В основу стека зачастую положен контейнер типа deque, с дополнительными методами, поэтому зачастую (в некоторых средах) можно получить доступ к изначальному deque и иным контейнерам в обход стека.