Класс stack: стек

Класс stack реализует стек (очередь, в которой последний уходит первым) на основе последовательного контейнера. По умолчанию в качестве контейнера используется класс deque. При получении значения возвращается элемент, который был добавлен позже других элементов. Объявление класса stack выглядит следующим образом:

template<typename _Tp, typename _Sequence = deque<_Tp> >
   class stack;

Прежде чем использовать класс, необходимо в начало программы добавить инструкцию:

#include <stack>

Создать экземпляр класса stack можно следующими способами (полный список конструкторов смотрите в документации):

  • объявить переменную без инициализации. Для этого перед названием переменной указывается название класса, а после названия внутри угловых скобок задается тип данных. В этом случае стек не содержит элементов. Пример объявления без инициализации, добавления элементов в конец очереди, получения и удаления элементов из конца очереди:
std::stack<int> s;
s.push(1);                         // Добавляем элементы
s.push(2);
s.push(3);
while (!s.empty()) {
   std::cout << s.top() << ' ';    // Получаем значение
   s.pop();                        // Удаляем последний элемент
}
std::cout << std::endl;            // 3 2 1

Внутри угловых скобок после типа данных можно дополнительно указать тип контейнера. По умолчанию в качестве контейнера используется класс deque. Вместо класса deque можно использовать классы list и vector. Пример указания класса list:

std::stack<int, std::list<int> > s;
  • внутри круглых скобок указать объект, имеющий тип контейнера. В этом случае все элементы из контейнера будут скопированы в очередь или перемещены:
// Копирование элементов из списка
std::list<int> my_list = {1, 2, 3};
std::stack<int, std::list<int> > s(my_list);
while (!s.empty()) {
   std::cout << s.top() << ' ';
   s.pop();
}
std::cout << std::endl;                   // 3 2 1
std::cout << my_list.size() << std::endl; // 3
// Перемещение элементов из очереди
std::deque<int> my_deque = {4, 5, 6};
std::stack<int> s2(std::move(my_deque));
while (!s2.empty()) {
   std::cout << s2.top() << ' ';
   s2.pop();
}
std::cout << std::endl;                    // 6 5 4
std::cout << my_deque.size() << std::endl; // 0
  • указать объект класса stack внутри круглых скобок или после оператора = (можно создать копию объекта или переместить элементы):
std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s1(my_deque);
std::stack<int> s2(s1);              // Копирование
std::cout << s1.size() << std::endl; // 3
std::cout << s2.size() << std::endl; // 3
std::stack<int> s3(std::move(s1));   // Перемещение
std::cout << s3.size() << std::endl; // 3
std::cout << s1.size() << std::endl; // 0

Над двумя объектами класса stack определены операции ==, !=, <, <=, > и >=. Пример сравнения двух объектов:

std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s1(my_deque), s2(s1);
if (s1 == s2) {
   std::cout << "s1 == s2" << std::endl;
}

С помощью оператора = можно создать копию или переместить элементы:

std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s1(my_deque), s2;
s2 = s1;                             // Копирование
std::cout << s1.size() << std::endl; // 3
std::cout << s2.size() << std::endl; // 3
s2 = std::move(s1);                  // Перемещение
std::cout << s2.size() << std::endl; // 3
std::cout << s1.size() << std::endl; // 0

Класс stack содержит следующие методы:

  • size() — возвращает количество элементов в стеке. Прототип метода:
size_type size() const;

Пример:

std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s(my_deque);
std::cout << s.size() << std::endl; // 3
  • empty() — возвращает значение true, если стек не содержит элементов, и false — в противном случае. Прототип метода:
bool empty() const;

Пример:

std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s1(my_deque), s2;
std::cout << std::boolalpha;
std::cout << s1.empty() << std::endl; // false
std::cout << s2.empty() << std::endl; // true
  • push() — добавляет элемент в стек. Прототипы метода:
void push(const value_type &x);
void push(value_type &&x);

Пример:

std::stack<int> s;
s.push(1); s.push(2); s.push(3);
while (!s.empty()) {
   std::cout << s.top() << ' ';
   s.pop();
}
std::cout << std::endl; // 3 2 1
  • emplace() — создает объект, передавая конструктору указанные через запятую значения, а затем добавляет объект в стек. Начиная со стандарта C++17, метод возвращает ссылку на созданный объект:
class C {
public:
   int x, y;
   C(int a, int b) : x(a), y(b) { }
};
// ... Фрагмент опущен ...
std::stack<C> s;
s.emplace(10, 20); s.emplace(30, 40); s.emplace(50, 60);
while (!s.empty()) {
   std::cout << s.top().x << ' ';
   s.pop();
}
std::cout << std::endl; // 50 30 10
  • top() — возвращает ссылку на элемент, расположенный на вершине стека. Элемент из стека не удаляется. Прототипы метода:
reference top();
const_reference top() const;
  • pop() — удаляет элемент, расположенный на вершине стека. Прототип метода:
void pop();

Пример:

std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s(my_deque);
std::cout << s.top() << std::endl; // 3
s.top() = 4;
std::cout << s.top() << std::endl; // 4
s.pop();
std::cout << s.top() << std::endl; // 2
  • swap() — меняет элементы двух стеков местами. Прототип метода:
void swap(stack &s);

Пример:

std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s1(my_deque), s2;
s2.push(4);
s1.swap(s2);
std::cout << s1.size() << std::endl;  // 1
std::cout << s2.size() << std::endl;  // 3

Вместо метода swap() можно воспользоваться одноименной функцией:

std::deque<int> my_deque = {1, 2, 3};
std::stack<int> s1(my_deque), s2;
s2.push(4);
std::swap(s1, s2);
std::cout << s1.size() << std::endl;  // 1
std::cout << s2.size() << std::endl;  // 3

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов