Pilha

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 17

Pilha

EStruturas de Dados e Algoritmos


Pilha
É uma estrutura de dados lineares, do tipo LIFO ( Last-in
first-out) em que a inserção e a remoção de elementos
se faz pela mesma extremidade, designada por topo da
pilha.

Exemplos :
• tabuleiro de recepção de serviço de um administrativo
• zona de memória auxiliar da execução de rotina de programação
Pilha - stack
Operações comuns:
⮚ criar uma pilha vazia
⮚ adicionar/remover um elemento à pilha
⮚ verificar qual o topo da pilha (último elemento adicionado)

Rui Camacho e Pedro Costa ESDA 3


Implementação da pilha - stack

A implementação da pilha pode ser feita com:

Um vetor
É necessário saber o índice do elemento que está no topo da pilha.

⮚ Push: Insere o novo elemento na primeira posição vazia e incrementa o índice do topo.
⮚ Pop: Se o vetor não estiver vazio, remove o elemento que cujo índice corresponde ao topo da pilha
e decrementa o índice.

Uma lista ligada

⮚ Push: Insere novo elemento no início da lista.


⮚ Pop: Remove o elemento do início da lista.

Rui Camacho e Pedro Costa ESDA | 4


Implementação da pilha

Que tipo de implementação devemos normalmente escolher ?

ESDA
Rui Camacho e Pedro Costa 5
|
Pilha
Uma lista ligada
🢝 Push: Insere novo elemento no início da lista.
PUSH
🢝 Pop: Remove o elemento do início da lista.

NULL

Inserir E1

Inserir E2

Inserir E3
Pilha
Uma lista ligada POP
🢝 Push: Insere novo elemento no início da lista.
🢝 Pop: Remove o elemento do início da lista.

NULL

Remover E1

Remover E2

Remover E3
Pilhas com STL
❑ As pilhas fazem parte da biblioteca de modelos padrão C++ (STL).

❑ Para se usar a pilha é preciso, incluir o stack header:

#include <stack>

❑ Para declarer usamos:

stack <Data_type> stack_name;

stack <int> sta1{{12,23,45,67,34,23} }; // declara a pilha sta1 do tipo int e insere os elementos

Normal é na declaração não inicializar com elementos mas ir inserindo um a um (push)

stack<string> sta2;

Informação detalhada em : https://en.cppreference.com/w/cpp/container/stack


ESDA
Rui Camacho e Pedro Costa 8
|
Pilha – stack métodos

stack<int> sta;

sta.size(); //retorna o tamanho da pilha sta

sta.empty(); //determina se a pilha sta está vazia

sta.push(x); // insere x no topo da pilha sta

sta.pop();// retira o element do topo da pilha sta

sta.top(); // retorna o elemento no topo da pilha sta

Relembrar que a pilha só insere no início por isso não existe o método insert
Relembrar que a pilha só retira do início por isso não existe o método erase.
Também não existe o find.

ESDA
Rui Camacho e Pedro Costa 9
|
Exemplo
#include <iostream> s.push(34);
#include <stack> s.push(23);
s.pop();
using namespace std; s.push(44);
s.pop();
// Print the queue s.pop();
void showq(stack<int> g) cout << "s.size() : " << s.size()<<endl;
{ cout << "s.top() : " << s.top()<<endl;
cout <<endl;
while (!g.empty()) { cout << "The stack s is : ";
cout << '\t' << g.top()<<endl; showq(s); Resultado
g.pop(); return 0;
} } The stack s is :
cout << endl; 30
} 20
int main() 10
{
stack<int> s; s.size() : 3
s.push(10); s.top() : 30
s.push(20); s.pop() :
s.push(30); 20
cout << "The stack s is : "; 10
showq(s);
s.size() : 2
cout << "s.size() : " << s.size()<<endl; s.top() : 20
cout << "s.top() : " << s.top()<<endl; The stack s is :
cout << "s.pop() : "; 20
s.pop(); 10
showq(s);
ESDA
Rui Camacho e Pedro Costa 10
|
Exemplos de aplicação

Notação RPN (Reverse Polish Notation)


expressões matemáticas onde os operadores surgem a seguir aos operandos (notação posfixa)
ex: 3 4 +
vantagem: não requer parênteses nem regras de precedência Outras notações:

Notação infixa (comum): operadores surgem entre os operandos


ex: 3 + 4

Notação prefixa: operadores surgem antes dos operandos


ex: + 3 4

Exemplo:
Notação infixa: 2 * ( 4 + 5 ) / 3
Notação RPN: 2 4 5 + * 3 /

Rui Camacho e Pedro Costa ESDA 11


Exemplos de aplicação
Algoritmo para avaliação de expressões RPN

1. Processar sequencialmente os elementos da expressão. Para cada elemento:

1.1 Se o elemento for um número (operando), colocá-lo na pilha (push)

1.2 Se o elemento for um operador


1.2.1 Retirar os dois elementos do topo da pilha (pop)
1.2.2. Processar os elementos de acordo com o operador
1.2.3. Colocar o resultado na pilha (push) 2. Retirar o (único) elemento da pilha. É o resultado.
Exemplo: 2 4 5 + * 3 /

5 + * /
Retirar 2 Retirar 2 Retirar 2
4 4 Elementos 9 Elementos 3 Elementos
4+5=9 2* 9=18 18/3=6
2 2 2 2 18 18

Rui Camacho e Pedro Costa ESDA 12


Exemplos de aplicação
#include <iostream>
#include <string> for ( auto i=0; i<out.size(); i++)
#include <vector> {
#include <sstream> if(out[i]=="+")
#include <stack> {
#include <iomanip> a=stof(st.top());
using namespace std; st.pop();
b=stof(st.top());
void print(stack<string> s) st.pop();
{ res=a+b;
cout << "Pilha:" << endl; st.push(to_string(res));
cout << fixed<< showpoint<<setprecision(1); print(st);
while ( !s.empty()) }
{ cout << stof(s.top())<<endl; if(out[i]=="-")
s.pop(); } {
} a=stof(st.top());
int main() st.pop();
{ b=stof(st.top());
string str="2 4 5 + * 3 /"; st.pop();
stringstream ss(str); res=b-a;
vector<string> out; st.push(to_string(res));
string s; print(st);
char delim = ' '; }
while (getline(ss, s, delim)) {
out.push_back(s);
}
stack<string> st;
float res=0;
float a,b;
ESDA
Rui Camacho e Pedro Costa 13
|
Exemplos de aplicação
if(out[i]=="*")
{ Resultado
a=stof(st.top()); Pilha:
st.pop(); 2.0
b=stof(st.top()); Pilha:
st.pop(); 4.0
res=a*b; 2.0
st.push(to_string(res)); Pilha:
print(st); 5.0
} 4.0
if(out[i]=="/") 2.0
{ Pilha:
a=stof(st.top()); 9.0
st.pop(); 2.0
b=stof(st.top()); Pilha:
st.pop(); 18.0
res=b/a; Pilha:
st.push(to_string(res)); 3.0
18.0
print(st); Pilha:
} 6.0
if((out[i]!="/") && ( out[i]!="-") && ( out[i]!="*") && ( out[i]!="+")) RPN: 2 4 5 + * 3 / = 6.0
{
st.push(out[i]);
print(st);
}
}
cout << fixed<< showpoint<<setprecision(1);
cout << "RPN: " << str << " = "<< stof(st.top())<< endl;

ESDA
Rui Camacho e Pedro Costa 14
|
Exercício 1
Uma possível aplicação de pilhas é a conversão entre bases numéricas. Pretende-se a implementação de um
programa que faça a conversão entre números representados no sistema de numeração decimal e números
representados no sistema de numeração binário, e vice-versa.
Exemplo
Numero: 25

25%2 = 1 12%1=0 6%2=0 3%2=1 1%2=1

1 1

0 0 0

0 0 0 0

1 1 1 1 1
Exemplo
Numero: 1 1 0 0 1

1 1
0 0 0
0 0 0 0
1 1 1 1 1

1* 2^4 = 24 1* 2^3=8 0*2^2=0 0*2^1=0 1%2^0=1

24+8+1=25

Você também pode gostar