Empilhar C++ STL com exemplo

โšก Resumo Inteligente

Empilhar C++ A STL implementa um adaptador de contรชiner LIFO que adiciona e remove elementos de uma รบnica extremidade, envolvendo-os.ping um contรชiner de sequรชncia subjacente, como deque, vetor ou lista, para gerenciar dados ordenados.

  • ๐Ÿ”˜ Princรญpio LIFO: A pilha std::stack segue a ordem LIFO (รšltimo a Entrar, Primeiro a Sair), portanto, o elemento inserido mais recentemente รฉ sempre o primeiro a ser removido.
  • ๐Ÿ“ฆ Adaptador de contรชiner: Uma pilha envolve um contรชiner de sequรชncia existente e, por padrรฃo, usa o tipo deque quando nenhum tipo de contรชiner รฉ fornecido.
  • โž• Operaรงรตes principais: As funรงรตes push, pop e top inserem um item, removem o item de cima e leem o item de cima, respectivamente.
  • ๐Ÿ” Verificaรงรตes estaduais: As funรงรตes `empty` e `size` informam se a pilha contรฉm elementos e quantos ela armazena atualmente.
  • ๐Ÿ” Funรงรตes extras: As funรงรตes `emplace` e `swap` criam um elemento no prรณprio local e trocam o conteรบdo de duas pilhas.
  • ๐Ÿค– Assistรชncia de IA: Assistentes de codificaรงรฃo com IA, como o GitHub Copilot, geram cรณdigo padrรฃo para operaรงรตes de push, pop e traversal na pilha a partir de um comentรกrio curto.

Empilhar C++ STL

O que รฉ std::stack?

Uma pilha รฉ uma estrutura de dados que opera com base na tรฉcnica LIFO (Last In First Out). O std::stack permite que elementos sejam adicionados e removidos apenas de uma extremidade.

A classe `std::stack` รฉ um adaptador de contรชiner. Objetos contรชiner armazenam dados de um mesmo tipo. Vocรช pode criar uma pilha a partir de vรกrios contรชineres de sequรชncia. Se nenhum contรชiner for fornecido, o contรชiner `deque` serรก usado por padrรฃo. Adaptadores de contรชiner nรฃo suportam iteradores, portanto, nรฃo podem ser usados โ€‹โ€‹para manipular dados.

Sintaxe de pilha

Para criar uma pilha, devemos incluir o arquivo de cabeรงalho em nosso cรณdigo. Em seguida, usamos esta sintaxe para definir std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • Formato โ€“ รฉ o tipo de elemento contido em std::stack. Pode ser qualquer vรกlido C++ tipo ou atรฉ mesmo um tipo definido pelo usuรกrio.
  • Recipiente โ€“ รฉ o tipo do objeto contรชiner subjacente.

Tipos de membros

Aqui estรฃo os tipos de membros da pilha:

  • tipo_de_valorโ€“ O primeiro parรขmetro do modelo, T. Ele denota os tipos de elementos.
  • tipo_de_containerโ€“ O segundo parรขmetro do modelo, Container. Ele indica o tipo de contรชiner subjacente.
  • tipo_de_tamanhoโ€“ Tipo inteiro sem sinal.

Operaรงรตes na pilha

A C++ stack suporta as seguintes operaรงรตes bรกsicas:

  • empurrar โ€“ Adiciona/empurra um item para a pilha.
  • estouro โ€“ Remove um item da pilha.
  • espreitar โ€“ Retorna o item do topo da pilha sem removรช-lo.
  • estรก cheio โ€“ Verifica se uma pilha estรก cheia.
  • estรก vazia โ€“ Verifica se uma pilha estรก vazia.

Implementaรงรฃo de pilha

Os passos a seguir mostram como o topo da pilha se desloca ร  medida que os itens sรฃo adicionados e removidos:

Passo 1) Inicialmente, temos uma pilha vazia. O topo de uma pilha vazia รฉ definido como -1.

Passo 2) Em seguida, inserimos o elemento 5 na pilha. O topo da pilha apontarรก para o elemento 5.

Passo 3) Em seguida, inserimos o elemento 50 na pilha. O topo da pilha se desloca e aponta para o elemento 50.

Passo 4) Em seguida, realizamos uma operaรงรฃo de despojo, removendo o elemento do topo da pilha. O elemento 50 foi despojado da pilha. O topo da pilha agora aponta para o elemento 5.

Implementaรงรฃo de pilha

push() e pop()

A funรงรฃo `stack::push()` adiciona um novo item ao topo da pilha. O tamanho da pilha รฉ incrementado em 1 apรณs a inserรงรฃo. A funรงรฃo aceita a seguinte sintaxe:

stack.push(value)

O valor รฉ o item a ser inserido na pilha.

A funรงรฃo `stack::pop()` remove o elemento do topo da pilha. Este รฉ o item mais recente da pilha. O tamanho da pilha รฉ reduzido em 1 apรณs a remoรงรฃo. Aqui estรก a sintaxe da funรงรฃo:

stack.pop()

A funรงรฃo nรฃo aceita parรขmetros.

1 exemplo:

#include <iostream> 
#include <stack> 
using namespace std;
int main() {
	stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	
         st.pop();
	st.pop();

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

Saรญda:

push() e pop()

Aqui estรก uma captura de tela do cรณdigo:

push() e pop()

Code Explicaรงรฃo:

  1. Inclua o arquivo de cabeรงalho iostream em nosso cรณdigo para usar suas funรงรตes.
  2. Inclua o arquivo de cabeรงalho da pilha em nosso cรณdigo para usar suas funรงรตes.
  3. Inclua o namespace std em nosso cรณdigo para usar suas classes sem chamรก-lo.
  4. Chame a funรงรฃo main(). A lรณgica do programa deve ser adicionada nesta funรงรฃo.
  5. Crie uma pilha st para armazenar valores inteiros.
  6. Use a funรงรฃo push() para inserir o valor 10 na pilha.
  7. Use a funรงรฃo push() para inserir o valor 20 na pilha.
  8. Use a funรงรฃo push() para inserir o valor 30 na pilha.
  9. Use a funรงรฃo push() para inserir o valor 40 na pilha.
  10. Use a funรงรฃo pop() para remover o elemento superior da pilha, ou seja, 40. O elemento superior agora se torna 30.
  11. Use a funรงรฃo pop() para remover o elemento superior da pilha, ou seja, 30. O elemento superior agora se torna 20.
  12. Use um loop while e uma funรงรฃo vazia() para verificar se a pilha NรƒO estรก vazia. O ! รฉ o operador NOT.
  13. Imprimindo o conteรบdo atual da pilha no console.
  14. Chame a funรงรฃo pop() na pilha.
  15. Fim do corpo do loop while.
  16. Fim do corpo da funรงรฃo main().

vazio(), tamanho(), topo()

As pilhas possuem funรงรตes integradas que vocรช pode usar para brincar com a pilha e seus valores. Esses incluem:

  • vazio()โ€“ verifica se uma pilha estรก vazia ou nรฃo.
  • Tamanho()โ€“ retorna o tamanho da pilha, ou seja, o nรบmero de elementos em uma pilha.
  • topo()โ€“ Acessa o elemento da pilha no topo.

2 exemplo:

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> st;
	st.push(32);
	st.push(21);
	st.push(39);
	st.push(89);
	st.push(25);

	cout << "The stack st is: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

Saรญda:

vazio(), tamanho(), topo()

Aqui estรก uma captura de tela do cรณdigo:

vazio(), tamanho(), topo()

Code Explicaรงรฃo:

  1. Inclua o arquivo de cabeรงalho iostream em nosso cรณdigo para usar suas funรงรตes.
  2. Inclua o arquivo de cabeรงalho da pilha em nosso cรณdigo para usar suas funรงรตes.
  3. Inclua o namespace std em nosso programa para usar suas classes sem chamรก-lo.
  4. Crie a funรงรฃo createStack que podemos usar para criar a pilha mystack. A pilha conterรก um conjunto de inteiros.
  5. O inรญcio do corpo da funรงรฃo createStack.
  6. Crie uma instรขncia do tipo de dados mystack e dรช a ela o nome ms.
  7. Use o loop while e a funรงรฃo vazia() para verificar se a pilha estรก vazia.
  8. O inรญcio do corpo do loop while.
  9. Use a funรงรฃo top() armazenada no topo da pilha. O caractere \t criarรก uma nova aba.
  10. Use a funรงรฃo pop() para excluir o elemento no topo da pilha.
  11. Fim do corpo do loop while.
  12. Imprima uma linha em branco no console.
  13. Fim do corpo da funรงรฃo createStack.
  14. Chame a funรงรฃo main(). A lรณgica do programa deve ser adicionada ao corpo da funรงรฃo main().
  15. O inรญcio do corpo da funรงรฃo main().
  16. Crie um objeto de pilha st.
  17. Use a funรงรฃo push() para inserir o elemento 32 na pilha.
  18. Use a funรงรฃo push() para inserir o elemento 21 na pilha.
  19. Use a funรงรฃo push() para inserir o elemento 39 na pilha.
  20. Use a funรงรฃo push() para inserir o elemento 89 na pilha.
  21. Use a funรงรฃo push() para inserir o elemento 25 na pilha.
  22. Imprima algum texto no console.
  23. Chame a funรงรฃo createStack para executar as operaรงรตes de inserรงรฃo acima na pilha.
  24. Imprima o tamanho da pilha no console junto com outro texto.
  25. Imprima o elemento no topo da pilha no console.
  26. Imprima algum texto no console.
  27. Exclua o elemento no topo da pilha. Em seguida, ele retornarรก os elementos restantes na pilha.
  28. Chame a funรงรฃo createStack para executar as operaรงรตes acima.
  29. O programa deve retornar o valor apรณs a conclusรฃo bem-sucedida.
  30. Fim do corpo da funรงรฃo main().

emplace() e swap()

Estas sรฃo outras funรงรตes de pilha integradas:

  • emplace()โ€“ Constrรณi e, em seguida, insere um novo elemento no topo da pilha.
  • trocar()โ€“ troca o conteรบdo de uma pilha com o conteรบdo de outra pilha.

3 exemplo:

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> st2;

	st1.emplace(12);
	st1.emplace(19);

	st2.emplace(20);
	st2.emplace(23);

	st1.swap(st2);

	cout << "st1 = ";
	while (!st1.empty()) {
		cout << st1.top() << " ";
		st1.pop();
	}

	cout << endl << "st2 = ";
	while (!st2.empty()) {
		cout << st2.top() << " ";
		st2.pop();
	}
}

Saรญda:

emplace() e swap()

Aqui estรก uma captura de tela do cรณdigo:

emplace() e swap()

Code Explicaรงรฃo:

  1. Inclua o arquivo de cabeรงalho iostream em nosso cรณdigo para usar suas funรงรตes.
  2. Inclua o arquivo de cabeรงalho da pilha em nosso cรณdigo para usar suas funรงรตes.
  3. Inclua o arquivo de cabeรงalho cstdlib em nosso cรณdigo para usar suas funรงรตes.
  4. Inclua o namespace std em nosso cรณdigo para usar suas classes sem chamรก-lo.
  5. Chame a funรงรฃo main(). A lรณgica do programa serรก adicionada ao corpo desta funรงรฃo.
  6. Declare uma pilha chamada st1 para armazenar valores inteiros.
  7. Declare uma pilha chamada st2 para armazenar valores inteiros.
  8. Use a funรงรฃo emplace() para inserir o inteiro 12 na pilha chamada st1.
  9. Use a funรงรฃo emplace() para inserir o inteiro 19 na pilha chamada st1.
  10. Use a funรงรฃo emplace() para inserir o inteiro 20 na pilha chamada st2.
  11. Use a funรงรฃo emplace() para inserir o inteiro 23 na pilha chamada st2.
  12. Use a funรงรฃo swap() para trocar o conteรบdo das duas pilhas, st1 e st2. O conteรบdo da pilha st1 deve ser movido para a pilha st2. O conteรบdo da pilha st2 deve ser movido para a pilha st1.
  13. Imprima algum texto no console.
  14. Use a instruรงรฃo while e a funรงรฃo vazia() para verificar se a pilha st1 nรฃo estรก vazia.
  15. Imprima o conteรบdo da pilha st1 no console. O โ€ โ€ adiciona espaรงo entre os elementos da pilha ao imprimi-los no console.
  16. Execute a funรงรฃo pop() na pilha st1 para remover o elemento superior.
  17. Fim do corpo da instruรงรฃo while.
  18. Imprima algum texto no console. O final รฉ um C++ palavra-chave para a linha final. Ele move o cursor do mouse para a prรณxima linha para comeรงar a imprimir a partir daรญ.
  19. Use a instruรงรฃo while e a funรงรฃo vazia() para verificar se a pilha st2 nรฃo estรก vazia.
  20. Imprima o conteรบdo da pilha st2 no console. O โ€ โ€ adiciona espaรงo entre os elementos da pilha ao imprimi-los no console.
  21. Execute a funรงรฃo pop() na pilha st2 para remover o elemento superior.
  22. Fim do corpo da instruรงรฃo while.
  23. Fim do corpo da funรงรฃo main().

Pilha em STL

A STL (Standard Template Library) vem com classes de modelo que fornecem C++ estruturas de dados. Portanto, uma pilha tambรฉm pode ser implementada em STL. Simplesmente incluรญmos esta biblioteca em nosso cรณdigo e a usamos para definir uma pilha.

stack<T> st; 

A sintaxe acima declara uma pilha st para elementos do tipo de dados T.

4 exemplo:

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

Saรญda:

Pilha em STL

Aqui estรก uma captura de tela do cรณdigo:

Pilha em STL

Code Explicaรงรฃo:

  1. Inclua o arquivo de cabeรงalho iostream em nosso cรณdigo para usar suas funรงรตes.
  2. Inclua o arquivo de cabeรงalho da pilha em nosso cรณdigo para usar suas funรงรตes.
  3. Inclua o arquivo de cabeรงalho cstdlib em nosso cรณdigo para usar suas funรงรตes.
  4. Inclua o namespace std em nosso cรณdigo para usar suas classes sem chamรก-lo.
  5. Chame a funรงรฃo main(). A lรณgica do programa deve ser adicionada ao corpo desta funรงรฃo.
  6. Declare uma pilha st para armazenar dados inteiros.
  7. Adicione o elemento 12 ร  pilha.
  8. Adicione o elemento 19 ร  pilha.
  9. Adicione o elemento 20 ร  pilha.
  10. Imprima o elemento no topo da pilha no console.
  11. Imprima o tamanho da pilha no console.
  12. Fim do corpo da funรงรฃo main().

Perguntas Frequentes

Uma pilha segue a ordem รšltimo a Entrar, Primeiro a Sair (LIFO), removendo primeiro o elemento mais recente. Uma fila segue a ordem Primeiro a Entrar, Primeiro a Sair (FIFO), removendo primeiro o elemento mais antigo. Cada uma atende a diferentes necessidades de processamento.

Sim. O std::stack aceita qualquer contรชiner de sequรชncia como seu segundo argumento de modelo, como std::stack A deque padrรฃo รฉ adequada para a maioria dos casos, enquanto o vetor pode melhorar a localidade da memรณria quando a pilha cresce de forma previsรญvel.

Tanto o push quanto o pop sรฃo executados em tempo constante O(1) porque a pilha sรณ toca em seu elemento do topo. A deque subjacente adiciona itens sem deslocar os existentes, portanto o desempenho permanece previsรญvel independentemente do tamanho da pilha.

A classe `std::stack` nรฃo expรตe iteradores, portanto, um loop baseado em intervalo nรฃo serรก compilado. Para ler todos os valores, copie a pilha e chame repetidamente `top()` e `pop()` na cรณpia, ou escolha uma deque quando a travessia for necessรกria.

A funรงรฃo pop() retorna void por design, separando a remoรงรฃo do acesso para seguranรงa contra exceรงรตes. Ler e remover em uma รบnica etapa poderia resultar em perda de dados caso a cรณpia gerasse um erro, portanto, vocรช chama top() primeiro e depois pop().

Nรฃo. A pilha std::stack nรฃo oferece sincronizaรงรฃo integrada, portanto, chamadas simultรขneas de push e pop de mรบltiplas threads causam condiรงรตes de corrida. Proteja o acesso compartilhado com um mutex ou outro mecanismo de bloqueio antes de usar uma pilha entre vรกrias threads.

Sim. Os assistentes de codificaรงรฃo de IA leem um comentรกrio ou nome de funรงรฃo e produzem declaraรงรตes de std::stack, loops push e pop e lรณgica de percurso. RevA visualizaรงรฃo das verificaรงรตes de limites geradas, como os testes empty() antes de pop(), continua sendo importante para programas seguros.

Sim. Travas deslizantes portรกteis Copiloto do GitHub Executa as chamadas push, pop, top e empty() conforme vocรช digita e sugere opรงรตes de contรชiner. ร‰ 2026. C++ A inteligรชncia de cรณdigo adiciona reconhecimento de sรญmbolos, de modo que as sugestรตes de pilha de vรกrios arquivos permaneรงam consistentes.

Resuma esta postagem com: