Como prometi, aqui esta o programa, porem eu fiz algumas modificações.
A classe pilha ela esta na internet para todos.
import javax.swing.*;
import java.io.*;
class TestePilha{
/**
* Metodo Principal - Metodo de execuçao do programa
*/
public static void main(String args[])throws Exception
{
//************************************* Instrução ************************************
JOptionPane.showMessageDialog(null," Este trabalho consiste em receber uma expressao matematica e fazer uma conversão."+
"\n Esta conversão pode ocorrer de duas maneiras."+
"\n 1ª) De Infixada para Pós-Fixada"+
"\n 2ª) De Pós-Fixada para Infixada "," Trabalho Prático sobre Pilha ",JOptionPane.INFORMATION_MESSAGE);
//**************************** Declaraçao de variaveis ********************************
Pilha P,A,L;//Pilha Principal, Auxiliar, Lixo
Object exp_mat_rec;//Esta sendo usado object para que se possa usar uma variedade de dados maior, isso se precisar.
int op;//variavel de controle na execução do menu
String fim;//Variavel controle da expressão matemática.
String exp_mat_pro;//Variavel "resposta" da expressão matematica.
char caracter;//Variavel posição dentro da expressao matematica
String convertida;//Variavel mudança de Tipo
String decisao;//Variavel controle da repetição do programa
Object desconvertida;//Variavel mudança de tipo
boolean parenteses;//Variavel controle de parenteses
//**************************** Inicialização de variaveis ****************************
decisao = "S";
fim = "#";
P = new Pilha();//principal
A = new Pilha();//auxiliar
L = new Pilha();//lixo
exp_mat_pro = "";
parenteses = false;
//**************************** Executando o Programa ********************************
//Este while controla a repetiçao do programa, ou seja,caso queira repetir a execuçao ele entra em ação
while(decisao.equals("S") || decisao.equals("s")){
//entrada da expressão matematica
exp_mat_rec = JOptionPane.showInputDialog(null," Digite a expressão matemática."," Expressão Matemática ",JOptionPane.QUESTION_MESSAGE);
//entrada da opçao de execuçao
op = Integer.parseInt(JOptionPane.showInputDialog(null," Escolha uma opção! \n "+
"(0) Finaliza o Programa. \n "+
"(1) Conversão de infixada para pós-fixada \n "+
"(2) Conversão de pós-fixada para infixada \n "," Opções para excutar o Programa ",JOptionPane.QUESTION_MESSAGE));
convertida = ""+exp_mat_rec;//Recebe a expressão do tipo Object e a coloca como String
convertida = convertida + fim;//Recebe a expressão mudada e coloca no final dela o caracter controle
//A variavel "op" é usada para controlar o menu do programa, ous eja, é ela que diz qual caminho o programa deve executar
switch(op){
//finaliza o programa
case 0:
{
System.exit(0);//finaliza o programa
break;
}//fim case 0
//expressão infixada para pós-fixada
case 1:
{ //O for ira percorrer a expressão ate o final
for(int i=0; i<convertida.length(); i++){
caracter = convertida.charAt(i);//recebe caracter por caracter.
//O switch seleciona qual caracter ira ser executado.
switch(caracter){
//É executado quando o caracter selecionado é um #.
//Ao ser executado quer dizer que a expressão mnatematica acabou de ser lida totalmente
case '#':
{
//desempilha a pilha auxiliar (é usado em caso de parenteses)
while(!A.vazia())
exp_mat_pro = exp_mat_pro + A.desempilha();//guarda na String o resultado
//desempilha a pilha principal (é usado quando o programa acaba)
while(!P.vazia())
exp_mat_pro = exp_mat_pro + P.desempilha();
//mostra a expressão recebida e a produzida
JOptionPane.showMessageDialog(null," A String recebida é: "+exp_mat_rec+"\n A String produzida é: "+exp_mat_pro," Resulatdo Final do Programa ",JOptionPane.INFORMATION_MESSAGE);
}//fim case #
break;
//É executado quando o caracter selecionado é um +.
case '+':
{//é ativado quando as variaveis estao dentro de parenteses
if(P.vazia()&& !L.vazia()) A.empilha(""+caracter);
else
//neste caso é ativado normalmente. Serão empilhados na pilha principal, se ela estiver vazia
if(P.vazia() && L.vazia())P.empilha(""+caracter);
else{
//senao começam as comparações
String guarda = ""+P.desempilha();
P.empilha(guarda);
//comparaçao feita para prevenir prioridade
if((guarda.equals("!")||guarda.equals("*")||guarda.equals("/"))&&(parenteses==false)){
while(!P.vazia())
exp_mat_pro = exp_mat_pro + P.desempilha();
P.empilha(""+caracter);
}//fim if((guarda.equals("!")||guarda.equals("*")||guarda.equals("/"))&&(parenteses==false))
else{
if((!guarda.equals("!"))&&(parenteses==false)){
P.empilha(""+caracter);
}//fim if((!guarda.equals("!"))&&(parenteses==false))
else{
//empilha na auxiliar
if(A.vazia()) A.empilha(""+caracter);
else{
String compara = ""+A.desempilha();
A.empilha(compara);
//previni a prioridade dos caracteres
if(compara.equals("*")||compara.equals("/")||compara.equals("!")){
exp_mat_pro = exp_mat_pro + A.desempilha();
}
A.empilha(""+caracter);
}//fim else
}
}
}//fim else
}//fim case +
break;
//É executado quando o caracter selecionado é um -.
case '-':
{//é ativado quando as variaveis estao dentro de parenteses
if(P.vazia()&& !L.vazia()) A.empilha(""+caracter);
else
//neste caso é ativado normalmente. Serão empilhados na pilha principal, se ela estiver vazia
if(P.vazia() && L.vazia())P.empilha(""+caracter);
else{
//senao começam as comparações
String guarda = ""+P.desempilha();
P.empilha(guarda);
//comparaçao feita para prevenir prioridade
if((guarda.equals("!")||guarda.equals("*")||guarda.equals("/"))&&(parenteses==false)){
while(!P.vazia())
exp_mat_pro = exp_mat_pro + P.desempilha();
P.empilha(""+caracter);
}//fim if((guarda.equals("!")||guarda.equals("*")||guarda.equals("/"))&&(parenteses==false))
else{
if((!guarda.equals("!"))&&(parenteses==false)){
P.empilha(""+caracter);
}//fim if((!guarda.equals("!"))&&(parenteses==false))
else{
//empilha na auxiliar
if(A.vazia()) A.empilha(""+caracter);
else{
String compara = ""+A.desempilha();
A.empilha(compara);
//previni a prioridade dos caracteres
if(compara.equals("*")||compara.equals("/")||compara.equals("!")){
exp_mat_pro = exp_mat_pro + A.desempilha();
}
A.empilha(""+caracter);
}//fim else
}
}
}//fim else
}//fim case -
break;
//É executado quando o caracter selecionado é um *.
case '*':
{//é ativado quando as variaveis estao dentro de parenteses
if(P.vazia()&& !L.vazia()) A.empilha(""+caracter);
else
//neste caso é ativado normalmente. Serão empilhados na pilha principal, se ela estiver vazia
if(P.vazia() && L.vazia())P.empilha(""+caracter);
else{
//senao começam as comparações
String guarda = ""+P.desempilha();
P.empilha(guarda);
//comparaçao feita para prevenir prioridade
if((guarda.equals("!"))&&(parenteses==false)){
exp_mat_pro = exp_mat_pro + P.desempilha();
P.empilha(""+caracter);
}//fim if(guarda.equals("!"))&&(parenteses==false))
else{
if((!guarda.equals("!"))&&(parenteses==false)){
P.empilha(""+caracter);
}//fim if((!guarda.equals("!"))&&(parenteses==false))
else{
//empilha na auxiliar
if(A.vazia()) A.empilha(""+caracter);
else{
String compara = ""+A.desempilha();
A.empilha(compara);
//previni a prioridade dos caracteres
if(compara.equals("*")||compara.equals("/")||compara.equals("!")){
exp_mat_pro = exp_mat_pro + A.desempilha();
}
A.empilha(""+caracter);
}//fim else
}
}
}//fim else
}//fim case *
break;
//É executado quando o caracter selecionado é um /.
case '/':
{//é ativado quando as variaveis estao dentro de parenteses
if(P.vazia()&& !L.vazia()) A.empilha(""+caracter);
else
//neste caso é ativado normalmente. Serão empilhados na pilha principal, se ela estiver vazia
if(P.vazia() && L.vazia())P.empilha(""+caracter);
//senao começam as comparações
else{
String guarda = ""+P.desempilha();
P.empilha(guarda);
//comparaçao feita para prevenir prioridade
if((guarda.equals("!"))&&(parenteses==false)){
exp_mat_pro = exp_mat_pro + P.desempilha();
P.empilha(""+caracter);
}//fim if(guarda.equals("!"))&&(parenteses==false))
else{
if((!guarda.equals("!"))&&(parenteses==false)){
P.empilha(""+caracter);
}//fim if((!guarda.equals("!"))&&(parenteses==false))
else{
//empilha na auxiliar
if(A.vazia()) A.empilha(""+caracter);
else{
String compara = ""+A.desempilha();
A.empilha(compara);
//previni a prioridade dos caracteres
if(compara.equals("*")||compara.equals("/")||compara.equals("!")){
exp_mat_pro = exp_mat_pro + A.desempilha();
}
A.empilha(""+caracter);
}//fim else
}
}
}//fim else
}//fim case /
break;
//É executado quando o caracter selecionado é um (.
case '(':
{
//empilha na pilha lixo o parenteses e muda a variavel controle de parenteses para true
L.empilha(""+caracter);
parenteses = true;//conmtrole de parenteses
}//fim case (
break;
//É executado quando o caracter selecionado é um ).
case ')':
{
//esvazia a pilha auxiliar toda, pois os parenteses chegaram ao fim
while(!A.vazia())
exp_mat_pro = exp_mat_pro + A.desempilha();
//desempilha da pilha principal para continuar na execuçao correta
while(!P.vazia())
exp_mat_pro = exp_mat_pro + P.desempilha();
//desempilha do lixo para manter sempre esta pilha vazia para que possa ser usada novamente sem erros no programa
while(!L.vazia())
L.desempilha();
parenteses = false;//muda a variavel para false mostrando que o parenteses ja acabou
}//fim case )
break;
//É executado quando o caracter selecionado é um !.
case '!':
{//é ativado quando as variaveis estao dentro de parenteses
if(P.vazia()&& !L.vazia()) A.empilha(""+caracter);
else
//neste caso é ativado normalmente. Serão empilhados na pilha principal, se ela estiver vazia
if(P.vazia() && L.vazia())P.empilha(""+caracter);
//senão começam as comparaçoes
else{
String guarda = ""+P.desempilha();
P.empilha(guarda);
//comparaçao feita para prevenir prioridade
if((guarda.equals("!"))&&(parenteses==false)){
exp_mat_pro = exp_mat_pro + P.desempilha();
P.empilha(""+caracter);
}//fim if(guarda.equals("!"))&&(parenteses==false))
else{
if((!guarda.equals("!"))&&(parenteses==false)){
P.empilha(""+caracter);
}//fim if((!guarda.equals("!"))&&(parenteses==false))
else{
A.empilha(""+caracter);
}//fim else
}
}
}//fim case !
break;
//É executado quando for letra, ou seja, quando nao for os sinais.
default:
{
exp_mat_pro = exp_mat_pro +""+ caracter;//concatena os caracteres à String
}//fim default
}//fim switch(caracter)
}//fim for
};//fim case 1
break;
//expressão pós-fixada --> infixada
case 2:
{
String especialA = "(";//caracter criado para auxiliar no controle e validaçao das expressoes
String especialB = ")";//caracter criado para auxiliar no controle e validaçao das expressoes
String first;//guarda o 1º caracter da pilha
String second;//guarda o 2º caracter da pilha
String parte;//guarda as concatenações dos desempilhamentos
//O for ira percorrer a expressão ate o final
for(int i=0; i<convertida.length(); i++){
caracter = convertida.charAt(i);//recebe caracter por caracter.
//O switch seleciona qual caracter ira ser executado.
switch(caracter){
//É executado quando o caracter seleciona é um
case '#':
{
exp_mat_pro = exp_mat_pro + P.desempilha();//concatena na string o conteudo da pilha principal
//mostra na tela
JOptionPane.showMessageDialog(null," A String recebida é: "+exp_mat_rec+"\n A String produzida é: "+exp_mat_pro," Resulatdo Final do Programa ",JOptionPane.INFORMATION_MESSAGE);
}//fim case #
break;
//É executado quando o caracter seleciona é um +
case '+':
{
first = ""+P.desempilha();//guarda a 1ª
second = ""+P.desempilha();//guarda a 2ª
parte = especialA + second + caracter + first + especialB;//guarda a concatenaçao
P.empilha(parte);//empilha a concatenaçao
}//fim case +
break;
//É executado quando o caracter seleciona é um -
case '-':
{
first = ""+P.desempilha();//guarda a 1ª
second = ""+P.desempilha();//guarda a 2ª
parte = especialA + second + caracter + first + especialB;//guarda a concatenaçao
P.empilha(parte);//empilha a concatenaçao
}//fim case -
break;
//É executado quando o caracter seleciona é um *
case '*':
{
first = ""+P.desempilha();//guarda a 1ª
second = ""+P.desempilha();//guarda a 2ª
parte = especialA + second + caracter + first + especialB;//guarda a concatenaçao
P.empilha(parte);//empilha a concatenaçao
}//fim case *
break;
//É executado quando o caracter seleciona é uma /
case '/':
{
first = ""+P.desempilha();//guarda a 1ª
second = ""+P.desempilha();//guarda a 2ª
parte = especialA + second + caracter + first + especialB;//guarda a concatenaçao
P.empilha(parte);//empilha a concatenaçao
}//fim case /
break;
//É executado quando o caracter seleciona é um !
case '!':
{
first = ""+P.desempilha();//guarda a 1ª
second = ""+P.desempilha();//guarda a 2ª
//agora acontece diferente.
//faz uma concatenaçao diferente. Sinal mais variavel
parte = especialA + first + caracter + especialB;
P.empilha(second);//empilha a segunda variavel
P.empilha(parte);//empilha a concatenaçao, porem do sinal com a variavel
}//fim case !
break;
//É executado quando o caracter seleciona é uma letra
default:
{
P.empilha(""+caracter);//empilha o caracter transformado para String
}//fim default
}//fim switch caracter
}//fim for
};//fim case 2
break;
//condiçao executada, caso o usuario digite um numero errado na opçao de execução
default:
{
//O while entra em ação quando o usuario digita um valor invalido na execuçao do menu
// e fica repetindo enquanto o valor for falso
while(op!=0 && op!=1 && op!=2){
op = Integer.parseInt(JOptionPane.showInputDialog(null," \n Escolha outra opção! Esta é invalida! \n "+
"(0) Finaliza o Programa. \n "+
"(1) Conversão de infixada para pós-fixada \n "+
"(2) Conversão de pós-fixada para infixada \n "," ERRO ENCONTRADO !!! ",JOptionPane.QUESTION_MESSAGE));
}//fim while
}//fim default
}//fim switch(op)
//"Zerando" variavel por segurança
exp_mat_pro = "";
//condiçao para repetir a execuçao do programa
decisao = JOptionPane.showInputDialog(" Continuar, digite (S)\n");
}//fim while(decisao.equals("S") || decisao.equals("s"))
}//fim main
}//fim class