Use STL Stack Container em C++

Jinku Hu 12 outubro 2023
  1. Use std::stack para declarar Stack Container Object em C++
  2. Use a função top() para acessar o elemento adicionado mais recentemente em C++
  3. Use a função swap() para trocar o conteúdo de duas pilhas em C++
Use STL Stack Container em C++

Este artigo demonstrará vários métodos sobre como usar o contêiner STL stack em C++.

Use std::stack para declarar Stack Container Object em C++

std::stack é chamado de adaptador de contêiner, que pode atuar como invólucro de contêineres padrão, mas fornece funcionalidade limitada e especializada. Como exemplo, a classe std::stack fornece estrutura de dados LIFO (último a entrar, primeiro a sair) e pode ser mapeada para um contêiner std::vector ou std::deque embaixo. std::stack pode ser inicializado com outro objeto stack ou recipientes de sequência compatíveis como deque,vector e list. Observe, porém, que o contêiner padrão usado para armazenar os elementos stack é deque. Além disso, não há nenhum construtor para suportar a passagem direta da lista ou dos elementos do inicializador. Precisamos usar o método push uma vez que o objeto stack tenha sido declarado.

Observe que o objeto stack não pode ser iterado usando o loop baseado em intervalo. Assim, implementamos um loop while especial para imprimir cada elemento no fluxo cout. A função printStack recebe o argumento stack, mas st1 que foi inicializado pelo objeto vector não pode ser passado para ela, pois os tipos destes dois objetos diferem e o compilador gera o erro.

#include <iostream>
#include <stack>
#include <vector>

using std::cout;
using std::endl;
using std::stack;
using std::vector;

template <typename T>
void printStack(stack<T> s) {
  while (!s.empty()) {
    cout << s.top() << "; ";
    s.pop();
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {1, 2, 3, 4, 11};
  stack st1{vec1};
  stack<int> st2;

  for (int i = 1; i <= 10; ++i) {
    st2.push(i * 12);
  }

  //    printStack(st1); Error - no matching function
  printStack(st2);

  return EXIT_SUCCESS;
}

Use a função top() para acessar o elemento adicionado mais recentemente em C++

A função top() é uma função membro que retorna o elemento superior da pilha. Observe que esta função não remove automaticamente um elemento retornado do objeto stack. Deve-se chamar a função de membro pop para removê-lo.

#include <iostream>
#include <stack>

using std::cout;
using std::endl;
using std::stack;

int main() {
  stack<int> st2;

  for (int i = 1; i <= 10; ++i) {
    st2.push(i * 12);
  }

  cout << "top of the stack st2: ";
  cout << st2.top() << endl;

  return EXIT_SUCCESS;
}

Resultado:

top of the stack st2: 120

Use a função swap() para trocar o conteúdo de duas pilhas em C++

A função swap() é uma função membro do contêiner stack. Ele faz uma referência ao objeto pilha e troca os elementos dessas pilhas. Observe que, o objeto st1, que é inicializado usando o objeto vector, não pode chamar a função swap ou ser um argumento para ela. Para permitir que o contêiner inicializado stack seja usado com a função swap, ele precisa ser criado usando a chamada std::move, já que o objeto st3 é inicializado no exemplo de código a seguir. Este último também pode ser passado para a função printStack sem problemas. Finalmente, trocamos os elementos dos objetos da pilha st2 / st3 e imprimimos os resultados no console.

#include <deque>
#include <iostream>
#include <stack>
#include <vector>

using std::cout;
using std::deque;
using std::endl;
using std::stack;
using std::vector;

template <typename T>
void printStack(stack<T> s) {
  while (!s.empty()) {
    cout << s.top() << "; ";
    s.pop();
  }
  cout << endl;
}

int main() {
  deque<int> deq1 = {11, 12, 13, 14};
  vector<int> vec1 = {1, 2, 3, 4, 11};
  stack st1{vec1};
  stack<int> st2;

  for (int i = 1; i <= 10; ++i) {
    st2.push(i * 12);
  }

  //    st2.swap(st1); Error
  stack<int> st3{std::move(deq1)};
  printStack(st2);
  printStack(st3);
  st2.swap(st3);
  printStack(st2);
  printStack(st3);

  return EXIT_SUCCESS;
}

Resultado:

120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
14; 13; 12; 11;
14; 13; 12; 11;
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook