Поделиться через


Класс 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++