Pilhas (stacks)

Uma pilha (stack) é uma estrutura de dados do tipo LIFO (Last-In, First-Out), onde o último elemento inserido é o primeiro a ser removido. Em C++, pode-se implementar pilhas de diversas formas: manualmente com arrays ou listas, ou utilizando a biblioteca padrão (std::stack).

1. Usar a biblioteca padrão (std::stack)

Inclua o cabeçalho <stack> e use os métodos principais:

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

int main() {
stack<int> pilha;

// Inserir elementos (push)
pilha.push(10);
pilha.push(20);
pilha.push(30);

// Tamanho da pilha
cout << "Tamanho da pilha: " << pilha.size() << endl;

// Aceder ao topo
cout << "Topo da pilha: " << pilha.top() << endl;

// Remover elemento do topo (pop)
pilha.pop();

cout << "Novo topo: " << pilha.top() << endl;
cout << "Tamanho após pop: " << pilha.size() << endl;

// Esvaziar a pilha
while (!pilha.empty()) {
cout << "Removendo: " << pilha.top() << endl;
pilha.pop();
}

return 0;
}

O método push insere, pop remove o topo, top acessa o topo, size retorna o tamanho e empty verifica se está vazia.

2. Implementar pilha manualmente com array

Exemplo de implementação básica:

#include <iostream>
#define TAMANHO 5
using namespace std;

typedef struct {
int topo;
int itens[TAMANHO];
} PILHA;

void iniciaPilha(PILHA &p) {
p.topo = -1;
}

bool pilhaVazia(PILHA p) {
return p.topo == -1;
}

bool pilhaCheia(PILHA p) {
return p.topo == TAMANHO - 1;
}

void empilha(PILHA &p, int x) {
if (!pilhaCheia(p))
p.itens[++p.topo] = x;
else
cout << "Pilha cheia!" << endl;
}

int desempilha(PILHA &p) {
if (!pilhaVazia(p))
return p.itens[p.topo--];
else {
cout << "Pilha vazia!" << endl;
return -1;
}
}

int main() {
PILHA s;
iniciaPilha(s);

empilha(s, 5);
empilha(s, 10);

cout << "Desempilhado: " << desempilha(s) << endl;
cout << "Desempilhado: " << desempilha(s) << endl;

return 0;
}

Essa implementação mostra as funções básicas: iniciar, empilhar, desempilhar, checar se está cheia ou vazia.

3. Principais operações de uma pilha

OperaçãoDescriçãoExemplo em C++ padrão
pushInsere elemento no topopilha.push(valor);
popRemove elemento do topopilha.pop();
topConsulta o elemento do topopilha.top();
sizeRetorna o número de elementospilha.size();
emptyVerifica se a pilha está vaziapilha.empty();

Observações

  • Pilhas são úteis para problemas como inversão de dados, avaliação de expressões e controle de chamadas de funções.
  • A implementação manual permite maior controle, mas o uso de std::stack é mais prático para a maioria dos casos.