Use STL Stack Container em C++
-
Use
std::stack
para declarar Stack Container Object em C++ -
Use a função
top()
para acessar o elemento adicionado mais recentemente em C++ -
Use a função
swap()
para trocar o conteúdo de duas pilhas 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;
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