В структуре данных стек данные организованы по принципу: последний вошел в стек - первый вышел из стека, то есть LIFO (last in, first out). - В структуре данных стек данные организованы по принципу: последний вошел в стек - первый вышел из стека, то есть LIFO (last in, first out).
- Обычно методы контейнера стек получают названия push, pop, top.
- Чтобы построить в C++ из списка стек, достаточно использовать методы либо push_front, pop_front, front, либо push_back, pop_back, back соответственно для методов стека push, pop, top.
- Для этого просто в реализации данных методов стека следует вызывать соответствующие методы контейнера std::list или другого подходящего контейнера.
- Например, метод стека pop может быть реализован как вызов соответствующего метода контейнера std::list:
- void pop() { c.pop_back(); }
- или
- void pop() { c.pop_front(); }
- Поэтому нет необходимости определять управление данными контейнера стек. Всю работу по управлению данными возьмет на себя контейнер std::list. Просто его методы, фактически, переименованы для адаптации к названиям методов контейнера стек.
Т.е. стек реализован не с нуля, он просто является адаптацией класса std::list (или vector или deque) под логику работы стека, то есть стек - это адаптер контейнера. - Т.е. стек реализован не с нуля, он просто является адаптацией класса std::list (или vector или deque) под логику работы стека, то есть стек - это адаптер контейнера.
- Чтобы было возможно как можно больше последовательных контейнеров адаптировать под стек, было принято соглашение ограничиться методами последовательных контейнеров push_back, pop_back, и back, так как эти методы более широко распространены среди последовательных контейнеров. Например, контейнер std::vector не имеет методов push_front и pop_front, поэтому его нельзя было использовать для моделирования методов стека, используя именно эти методы последовательных контейнеров.
- Однако стандартный последовательный контейнер std::forward_list, который был введен в стандарт C++ позже остальных стандартных последовательных контейнеров, не имеет методов push_back, pop_back и back. Поэтому адаптер контейнеров std::stack не может адаптировать этот контейнер для реализации стека.
- Адаптер stack теряет многие присущие базовому контейнеру методы ( например, at(), [ ] и др.), но приобретает свои собственные (push(), pop()).
- (по материалу: https://ru.stackoverflow.com/questions/479987/Что-такое-адаптер)
Do'stlaringiz bilan baham: |