Класс stack
Класс адаптера контейнера шаблона, который предоставляет ограничение функциональности, ограничивая доступ к элементу, который был последним добавлен в некоторый тип базового контейнера. Класс stack
используется, если важно ясно, что в контейнере выполняются только stack
операции.
Синтаксис
template <class Type, class Container= deque <Type>>
class stack
Параметры
Type
Тип данных элемента для сохранения в стеке.
Container
Тип базового контейнера, используемый для реализации стека. Значение по умолчанию — это класс deque<Type>
.
Замечания
Элементы класса Type
, указанного в первом параметре шаблона объекта стека, являются синонимами value_type
и должны соответствовать типу элемента в базовом классе Container
контейнера, заданном вторым параметром шаблона. Необходимо Type
назначить его, чтобы можно было копировать объекты этого типа и назначать значения переменным этого типа.
Подходящие базовые классы контейнеров для стека включаютdeque
,list
класс иvector
класс или любой другой контейнер последовательности, поддерживающий операции back
, push_back
и pop_back
. Класс базового контейнера инкапсулирован в адаптер контейнера, который предоставляет только ограниченный набор функций-членов контейнера последовательностей в виде открытого интерфейса.
Объекты stack
являются равными, если и только если элементы класса Type
являются равными и являются менее сопоставимыми, если и только если элементы класса Type
меньше, чем сопоставимы.
Класс
stack
поддерживает структуру данных последней версии (LIFO). Хороший аналог такого подхода — стопка тарелок. Элементы (тарелки) можно вставлять, проверять или удалять только из верхней части стека, которая является последним элементом в конце базового контейнера. Ограничение доступа только к верхнему элементу является причиной использованияstack
класса.Класс
queue
поддерживает структуру данных fiFO. Хороший аналог такого подхода — очередь из людей к банковскому служащему. Элементы (люди) можно добавлять в конец очереди и удалять из начала очереди. Проверять можно как начало, так и конец очереди. Ограничение доступа только к элементам передней и задней части таким образом является причиной того, что мех используетqueue
класс.Класс
priority_queue
упорядочивает его элементы таким образом, чтобы самый большой элемент всегда был в верхней позиции. Он поддерживает вставку элемента, а также проверку и удаление верхнего элемента. Хороший аналог такого подхода — очередь из людей, упорядоченная по возрасту, росту или любому другому критерию.
Участники
Конструкторы
Имя | Описание |
---|---|
stack |
Создает stack , который является пустым или копией объекта базового контейнера. |
Определения типов
Имя | Описание |
---|---|
container_type |
Тип, предоставляющий базовый контейнер для принятия stack . |
size_type |
Целочисленный Typedef без знака, который может представлять число элементов в stack . |
value_type |
Тип, представляющий тип объекта, который хранится в виде элемента в stack . |
Функции
Имя | Описание |
---|---|
empty |
Проверяет, является ли stack пустым. |
pop |
Удаляет элемент из верхней части stack . |
push |
Добавляет элемент в верхнюю часть stack . |
size |
Возвращает количество элементов в контейнере stack . |
top |
Возвращает ссылку на элемент в верхней части stack . |
container_type
Тип, предоставляющий базовый контейнер для изменения.
typedef Container container_type;
Замечания
Этот тип является синонимом для параметра шаблона Container
. Все три класса контейнера последовательности стандартной библиотеки C++ — vector
класс, list
класс и класс deque
по умолчанию — соответствуют требованиям, которые необходимо использовать в качестве базового контейнера для stack
объекта. Также можно использовать пользовательские типы, удовлетворяющие таким требованиям.
Дополнительные сведения см. в разделе "Примечания Container
" раздела stack
"Класс ".
Пример
Пример объявления и использования container_type
см. в примереstack::stack
.
empty
Проверяет, пуст ли стек.
bool empty() const;
Возвращаемое значение
true
Значение , если стек пуст; false
Значение , если стек не является непустим.
Пример
// stack_empty.cpp
// compile with: /EHsc
#include <stack>
#include <iostream>
int main( )
{
using namespace std;
// Declares stacks with default deque base container
stack <int> s1, s2;
s1.push( 1 );
if ( s1.empty( ) )
cout << "The stack s1 is empty." << endl;
else
cout << "The stack s1 is not empty." << endl;
if ( s2.empty( ) )
cout << "The stack s2 is empty." << endl;
else
cout << "The stack s2 is not empty." << endl;
}
The stack s1 is not empty.
The stack s2 is empty.
pop
Удаляет элемент из верхней части стека.
void pop();
Замечания
Для применения функции-члена стек должен быть непустым. Начало (верх) стека — это положение, занимаемое последним добавленным элементом, которое является последним элементом в конце контейнера.
Пример
// stack_pop.cpp
// compile with: /EHsc
#include <stack>
#include <iostream>
int main( )
{
using namespace std;
stack <int> s1, s2;
s1.push( 10 );
s1.push( 20 );
s1.push( 30 );
stack <int>::size_type i;
i = s1.size( );
cout << "The stack length is " << i << "." << endl;
i = s1.top( );
cout << "The element at the top of the stack is "
<< i << "." << endl;
s1.pop( );
i = s1.size( );
cout << "After a pop, the stack length is "
<< i << "." << endl;
i = s1.top( );
cout << "After a pop, the element at the top of the stack is "
<< i << "." << endl;
}
The stack length is 3.
The element at the top of the stack is 30.
After a pop, the stack length is 2.
After a pop, the element at the top of the stack is 20.
push
Добавляет элемент в верхнюю часть стека.
void push(const Type& val);
Параметры
val
Элемент, добавленный в верх стека.
Замечания
Начало (верх) стека — это положение, занимаемое последним добавленным элементом, которое является последним элементом в конце контейнера.
Пример
// stack_push.cpp
// compile with: /EHsc
#include <stack>
#include <iostream>
int main( )
{
using namespace std;
stack <int> s1;
s1.push( 10 );
s1.push( 20 );
s1.push( 30 );
stack <int>::size_type i;
i = s1.size( );
cout << "The stack length is " << i << "." << endl;
i = s1.top( );
cout << "The element at the top of the stack is "
<< i << "." << endl;
}
The stack length is 3.
The element at the top of the stack is 30.
size
Возвращает количество элементов в стеке.
size_type size() const;
Возвращаемое значение
Текущая длина стека.
Пример
// stack_size.cpp
// compile with: /EHsc
#include <stack>
#include <iostream>
int main( )
{
using namespace std;
stack <int> s1, s2;
stack <int>::size_type i;
s1.push( 1 );
i = s1.size( );
cout << "The stack length is " << i << "." << endl;
s1.push( 2 );
i = s1.size( );
cout << "The stack length is now " << i << "." << endl;
}
The stack length is 1.
The stack length is now 2.
size_type
Целочисленный тип без знака, который может представлять количество элементов в стеке.
typedef typename Container::size_type size_type;
Замечания
Этот тип является синонимом для size_type
базового контейнера, адаптированного стеком.
Пример
Пример объявления и использования size_type
см. в примереsize
.
stack
Создает стек, который является пустым или представляет собой копию класса базового контейнера.
stack();
explicit stack(const container_type& right);
Параметры
right
Контейнер, копией которого должен стать создаваемый стек.
Пример
// stack_stack.cpp
// compile with: /EHsc
#include <stack>
#include <vector>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
// Declares stack with default deque base container
stack <char> dsc1;
//Explicitly declares a stack with deque base container
stack <char, deque<char> > dsc2;
// Declares a stack with vector base containers
stack <int, vector<int> > vsi1;
// Declares a stack with list base container
stack <int, list<int> > lsi;
// The second member function copies elements from a container
vector<int> v1;
v1.push_back( 1 );
stack <int, vector<int> > vsi2( v1 );
cout << "The element at the top of stack vsi2 is "
<< vsi2.top( ) << "." << endl;
}
The element at the top of stack vsi2 is 1.
top
Возвращает ссылку на элемент вверху стека.
reference top();
const_reference top() const;
Возвращаемое значение
Ссылка на последний элемент в контейнере, вставленный вверху стека.
Замечания
Для применения функции-члена стек должен быть непустым. Начало (верх) стека — это положение, занимаемое последним добавленным элементом, которое является последним элементом в конце контейнера.
Если возвращаемое значение top
назначено объекту const_reference
, stack
объект нельзя изменить. Если возвращаемое значение top
назначено объекту reference
, stack
объект можно изменить.
Пример
// stack_top.cpp
// compile with: /EHsc
#include <stack>
#include <iostream>
int main( )
{
using namespace std;
stack <int> s1;
s1.push( 1 );
s1.push( 2 );
int& i = s1.top( );
const int& ii = s1.top( );
cout << "The top integer of the stack s1 is "
<< i << "." << endl;
i--;
cout << "The next integer down is "<< ii << "." << endl;
}
The top integer of the stack s1 is 2.
The next integer down is 1.
value_type
Тип, представляющий тип объекта, который хранится в стеке в виде элемента.
typedef typename Container::value_type value_type;
Замечания
Этот тип является синонимом для value_type
базового контейнера, адаптированного стеком.
Пример
// stack_value_type.cpp
// compile with: /EHsc
#include <stack>
#include <iostream>
int main( )
{
using namespace std;
// Declares stacks with default deque base container
stack<int>::value_type AnInt;
AnInt = 69;
cout << "The value_type is AnInt = " << AnInt << endl;
stack<int> s1;
s1.push( AnInt );
cout << "The element at the top of the stack is "
<< s1.top( ) << "." << endl;
}
The value_type is AnInt = 69
The element at the top of the stack is 69.
См. также
Потокобезопасность в стандартной библиотеке C++
Справочник по стандартной библиотеке C++