2. Pilha como Lista Encadeada
Política de escalonamento LIFO
Cada elemento possui um elo (endereço)
para outro elemento.
●
●
●
●
null
topo →
Elemento ou Nó para Pilha:
class No {
public int item;
public No ant;
}
Fonte: http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html
Elo para
outro Nó
3. Classe para Pilha Encadeada de int
class PilhaSE {
private No topo;
public PilhaSE() { topo = null; }
public boolean empty() { return (topo == null); }
public int top() { return topo.item; }
public void pop() { if (!empty()) topo = topo.ant; }
public void push(int valor) {
No novo = new No(); // Aloca memoria para novo Nó
novo.item = valor;
novo.ant = topo;
topo = novo;
}
} // fim classe Pilha como Lista Encadeada
4. Exemplo: Aplicação de Pilha
Notação infixa e pós-fixa
Considere a seguinte expressão:
(5 + 9) * 2 + 6 * 5
Se as operações não forem realizadas na ordem correta, obteremos o
resultado errado.
Essa expressão foi escrita na notação matemática usual. Essa notação
é chamada infixa. Uma das característica da notação infixa é que a
ordem das operações é determinada pela precedência do operador,
quando a ordem das operações requerem uma precedência diferente,
usamos os parênteses. Uma expressão entre parênteses é avaliada
primeiro.
Um matemático polonês Lukasiewicz apresentou uma alternativa para
essa notação que não necessita da utilização dos parênteses e não
requer uma procedência de operadores.
5. Notação Pós-fixa ou
Polonesa Reversa (NPR)
Essa notação é chamada de pós-fixa pois os operadores estão depois
dos operandos. Ela não faz uso de parênteses e não requer
precedência de operadores.
Infixa: (5 + 9) * 2 + 6 * 5
Pós-fixa: 5 9 + 2 * 6 5 * +
infixa pós-fixa
a-b ab-
a-b*c abc*-
(a-b)*c ab-c*
a+b*c^d-e abcd^*+e-
a*(b+c)*(d-g)*h abc+*dg-*h*
a*b-c*d^e/f+g*h ab*cde^*f/-gh*+
Exemplos:
6. O valor de uma notação pos-fixa pode ser calculada facilmente
com ajuda de uma pilha.
Pós-fixa: 5 9 + 2 * 6 5 * +
7. Calculadora pos-fixa NPR
import java.io.*;
import java.lang.*;
class No {
public int item; // conteúdo da pilha inteiro
public No ant;
}
class PilhaSE { // pilha de operandos inteiros
private No topo;
public PilhaSE() { topo = null; }
public boolean empty() { return (topo == null); }
public int top() { return topo.item; }
public void pop() { if (!empty()) topo = topo.ant; }
public void push(int valor) {
No novo = new No();
novo.item = valor;
novo.ant = topo;
topo = novo;
}
}
// Continua ...
8. // Continuação ...
class PilhaNPR {
public static void main(String[] args) throws IOException {
PilhaSE p = new PilhaSE();
int arg1, arg2;
char c;
System.out.println("Calculadora notação pos-fixa NPR");
System.out.println(" Exemplo de uso:n 5 9 + 2 * 6 5 * + ");
System.out.print("Informe sua expressao:n ");
String s = lerStr();
for (int i=0; i<s.length(); i++) {
c = s.charAt(i); // lendo caracter por caracter da string s
if (Character.isDigit(c)) // se caracter é numero
p.push(Character.digit(c,10)); // transforme char em int e adicione
// na pilha
else if(c=='+') {
arg1 = p.top(); p.pop();
arg2 = p.top(); p.pop();
p.push(arg1+arg2);
}
else if(c=='*') {
arg1 = p.top(); p.pop();
arg2 = p.top(); p.pop();
p.push(arg1*arg2);
} // Continua ...
9. // Continuação ...
else if(c=='-') {
arg1 = p.top(); p.pop();
arg2 = p.top(); p.pop();
p.push(arg1-arg2);
}
else if(c=='/') {
arg1 = p.top(); p.pop();
arg2 = p.top(); p.pop();
p.push(arg1/arg2);
}
else if(c=='^') {
arg1 = p.top(); p.pop();
arg2 = p.top(); p.pop();
p.push((int) Math.pow(arg1,arg2));
}
}
System.out.println("Resposta = " + p.top()); // Imprimindo calculo final
p.pop();
} // fim programa principal
public static String lerStr() throws IOException { // função para ler string
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
return br.readLine();
} // fim função ler string
} // fim classe principal
10. Atividade
1. Melhore a calculadora pós-fixa NPR incluindo as
seguintes funcionalidades:
(a) Adicione um método clear que esvazie a pilha.
(b) Adicione um método print que imprima o conteúdo da
pilha de operandos.
(c) Faça um menu para o usuário como se fosse uma
calculadora
2. Projete um programa usando pilha que transforme
uma expressão infixa em pós-fixa.