STL stack обеспечивает функциональность структуры данных стека в C++.

Структура данных стека следующая LIFO (Last In First Out) принцип. То есть элемент, добавленный последним, будет удален первым.

Структура данных стека

Чтобы узнать больше о стеках, посетите наш учебник по Stack Data Structure.

Создавать Stack

Чтобы создать стек в C++, нам сначала нужно включить stack заголовочный файл.

#include <stack>

Как только мы импортируем этот файл, мы можем создать stack используя следующий синтаксис:

stack<type> st;

Здесь, type указывает тип данных этой команды, которую мы хотим сохранить в стеке. Например,

// create a stack of integers
 stack<int> integer_stack; 
// create a stack of strings
stack<string> string_stack;

Пример: стек C++ STL

#include <iostream>

#include <stack>

using namespace std;

int main {
    // create a stack of strings

stack<string> languages;

    
    // add element to the Stack
    languages.push("C++");
    languages.push("Java");
    languages.push("Python");
    
    // print top element
    cout << languages.top;

    return 0;
}

Output

Python

В приведенном выше примере мы создали stack строк с именами языков .

Здесь мы использовали push для добавления элементов в стек. Затем мы использовали top для отображения верхнего элемента.

Мы узнаем больше о push а также top позже в учебнике.

Методы стека

В С++, stack Класс предоставляет различные методы для выполнения различных операций со стеком.

Операция Описание
push добавляет элемент в стек
pop удаляет элемент из стека
top возвращает элемент наверху стека
size возвращает количество элементов в стеке
empty возвращается true если стек пуст

Добавить элемент в стек

Мы используем push чтобы добавить элемент в стек. Например,

#include <iostream>

#include <stack>

using namespace std;

int main {

  // create a stack of strings
  stack<string> colors;

// помещаем элементы в стек colors.push(«Red»); colors.push(«Orange»);

  
  cout << "Stack: ";

  // print elements of stack
   while(!colors.empty) {
    cout << colors.top << ", ";
    colors.pop;
  }
 
  return 0;
}

Output

Stack: Orange, Red, 

В приведенном выше примере мы создали стек строк, называемых цветами. Затем мы использовали push для добавления элементов в стек.

colors.push("Red");
colors.push("Orange");

Вместо прямой печати содержимого стека мы использовали while цикл и различные методы стека.

while(!colors.empty) {
  cout << colors.top << ", ";
  colors.pop;
}

Чтобы напечатать все элементы стека, мы печатаем его top element а потом pop(удалить) его внутри цикла. Этот процесс повторяется до тех пор, пока стек не станет пустым.

мы узнаем о pop, top а также empty в ближайших разделах.

Также обратите внимание, что мы вставили элементы в следующем порядке: {«Red», «Orange»}.

Но при печати элементов мы получаем {«Orange», «Red»}.

Это связано с тем, что стек представляет собой структуру данных LIFO, что означает, что элемент, вставленный последним, извлекается первым.

Примечание. В отличие от векторов или других контейнеров, мы не можем использовать for loop для итерации по стеку. Это связано с тем, что стек STL является адаптером контейнера STL, который обеспечивает ограничительный доступ, чтобы заставить его вести себя как стандартная структура данных стека.

Удалить элементы из Stack

Мы можем удалить элемент из стека, используя pop. Например,

#include <iostream>
#include <stack>
using namespace std;

// function prototype this command this command for display_stack utility
void display_stack(stack<string> st);

int main {

  // create a stack of strings
  stack<string> colors;

  // push elements into the stack
  colors.push("Red");
  colors.push("Orange");
  colors.push("Blue");
  
  cout << "Initial Stack: ";
  // print elements of stack
  display_stack(colors);

// удаляет “Blue” как было вставлено последнее colors.pop;

  
  cout << "Final Stack: ";

  // print elements of stack
  display_stack(colors);
  
  return 0;
}

// utility function to display stack elements
void display_stack(stack<string> st) {

  while(!st.empty) {
    cout << st.top << ", ";
    st.pop;
  }

  cout << endl;
}

Output

Initial Stack: Blue, Orange, Red, 
Final Stack: Orange, Red,

В приведенном выше примере мы использовали pop для удаления элемента из стека.

Изначально содержимое стека {«Blue», «Orange», «Red»}.

Затем мы использовали pop чтобы удалить элемент.

// removes top element
colors.pop 

Это удаляет элемент в верхней части stack т.е. элемент, вставленный последним, т.е. «Blue».

Следовательно, окончательный стек становится {«Orange», «Red»}.

Доступ к элементам из Stack

Мы получаем доступ к элементу на вершине стека, используя top. Например,

#include <iostream>
#include <stack>
using namespace std;

int main {

  // create a stack of strings
  stack<string> colors;

  // push element into the stack
  colors.push("Red");
  colors.push("Orange");
  colors.push("Blue");
  
  // get top element

string top = colors.top;

  cout << "Top Element: " << top;
  
  return 0;
}

Output

Top Element: Blue

В приведенном выше примере мы создали стек строк, называемых цветами, и добавили следующие элементы: «Red», «Orange» а также «Blue».

Затем мы использовали top для доступа к верхнему элементу:

string top = colors.top; 

Здесь, «Blue» был вставлен последним, поэтому top element.

Получить размер стека

Мы используем size чтобы получить количество элементов в stack. Например,

#include <iostream>
#include <stack>
using namespace std;

int main {

  // create a stack of int
  stack<int> prime_nums;

  // push elements into the stack
  prime_nums.push(2);
  prime_nums.push(3);
  prime_nums.push(5);

// получаем размер стека int size = prime_nums.size;

  cout << "Size of the stack: " << size;

  return 0;
}

Output

Size of the stack: 3

В приведенном выше примере мы создали стек целых чисел с именем prime_nums и добавили в него три элемента.

Затем мы использовали size чтобы найти количество элементов в стеке:

prime_nums.size;

Так как мы добавили в стек 3 элемента, prime_nums.size возвращается 3.

Проверьте, пуст ли стек

Мы используем empty чтобы проверить, пуст ли стек. Этот метод возвращает:

  • 1(true)— если стек пуст
  • 0(false)— если стек не пуст

Например,

#include <iostream>
#include <stack>
using namespace std;

int main {

  // create a stack of double
  stack<double> nums;
  
  cout << "Is the stack empty? ";

// проверяем, пуст ли стек if (nums.empty) {

    cout << "Yes" << endl;
  }
  else {
    cout << "No" << endl;
  }

  cout << "Pushing elements..." << endl;

  // push element into the stack
  nums.push(2.3);
  nums.push(9.7);
 
  cout << "Is the stack empty? ";

// проверяем, пуст ли стек if (nums.empty) {

    cout << "Yes";
  }
  else {
    cout << "No";
  }

  return 0;
}

Output

Is the stack empty? Yes
Pushing elements...
Is the stack empty? No

В приведенном выше примере мы использовали empty определить, если stack пустой,

if(nums.empty) { // returns false
  cout << "Yes" << end;;
}
else {
  cout << "No" << endl; 
}

Изначально в стеке нет элементов. Так nums.empty возвращается true.

Затем мы добавили элементы в стек.

Опять же, мы используем nums.empty чтобы определить, пуст ли стек. На этот раз возвращается false.

Выше есть информация о Как использовать стек C++ Чтобы узнать больше о стеках [Detailed Guide]. Если у вас есть какие либо вопросы, пожалуйста спрашивайте fixsy.org в комментарии ниже. Я рад помочь вам.