Olá Galera,
Sou novo aqui no forum e qualquer coisa que eu fiz errado me avisem, por favor.
Sou iniciante em programação!
Então…
Eu estou tentando fazer um programinha que converta uma expressão da forma infixa para forma posfixa. Eu fiz uma parte(acho que da forma errada) que está funcionando com as expressões que coloquei manualmente, mas se a expressão é alterada ele converte errado.
Gostaria de saber se alguém pode me explicar como fazer ou mostrar um algoritmo de algum que esteja funcionando.
Segue abaixo o que fiz a té agora.
Desde já agradeço a colaboração galera.
[code]public class InfPos{
public static void main(String [] args){
Pilha pilhaI=new Pilha();
Pilha pilhaT=new Pilha();
Pilha pilhaP=new Pilha();
Pilha pilhaPrint=new Pilha();
int cont=0, cont2=0;
char tmp=’ ‘;
//Insere a expressão de forma infixa na pilhaI
// A+BC-D+E/F
// ABC+D-EF/+
System.out.println(“Infixa: A+BC-D+E/F");
System.out.println("Posfixa: ABC+D-EF/+”);
System.out.print("Programa: ");
pilhaI.push(‘F’);
pilhaI.push(’/’);
pilhaI.push(‘E’);
pilhaI.push(’+’);
pilhaI.push(‘D’);
pilhaI.push(’-’);
pilhaI.push(‘C’);
pilhaI.push(’’);
pilhaI.push(‘B’);
pilhaI.push(’+’);
pilhaI.push(‘A’);
// (A+B)(C/D)-(E+F)
// AB+CD/EF±
/ System.out.println(“Infixa: (A+B)*(C/D)-(E+F)”);
pilhaI.push('(');*/
//Transforma a expressão de infixa para posfixa
while(!(pilhaI.isEmpty())){
char aux=pilhaI.pop();
switch(aux){
case '(':{
pilhaT.push(aux);
}
break;
case ')':{
//Enquanto naum encontrar "(" transfere os operadores da pilhaT para pilhaP
//Quando encontrar ele para
tmp=pilhaT.pop();
while(tmp!='('){
pilhaP.push(tmp);
tmp=pilhaT.pop();
break;
}
}
break;
case '+':{
//Ele verifica se na pilhaT tem algum operador "*" ou "/"
//Se tiver, ele tira da pilhaT e coloca na pilhaP e depois empilha o "+" na pilhaT
//Se naum tiver ele apenas empilha o "+" na pilhaT
if(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(tmp=='('){
pilhaT.push(tmp);
pilhaT.push(aux);
}
else{
if((tmp=='*')||(tmp=='/')){
pilhaP.push(tmp);
tmp=pilhaT.pop();
while((tmp!='*')||(tmp!='/')){
pilhaP.push(tmp);
tmp=pilhaT.pop();
break;
}
pilhaT.push(tmp);
pilhaT.push(aux);
}
else{
if((tmp=='+')||(tmp=='-')){
pilhaP.push(tmp);
pilhaT.push(aux);
}
}
}
}
else{
pilhaT.push(aux);
}
}
break;
case '-':{
//Ele verifica se na pilhaT tem algum operador "*" ou "/"
//Se tiver, ele tira da pilhaT e coloca na pilhaP e depois empilha o "-" na pilhaT
//Se naum tiver ele apenas empilha o "-" na pilhaT
if(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(tmp=='('){
pilhaT.push(tmp);
pilhaT.push(aux);
}
else{
if((tmp=='*')||(tmp=='/')){
pilhaP.push(tmp);
tmp=pilhaT.pop();
while((tmp!='*')||(tmp!='/')){
pilhaP.push(tmp);
tmp=pilhaT.pop();
break;
}
pilhaT.push(tmp);
pilhaT.push(aux);
}
else{
if((tmp=='+')||(tmp=='-')){
pilhaP.push(tmp);
pilhaT.push(aux);
}
}
}
}
else{
pilhaT.push(aux);
}
}
break;
case '*':{
//Apenas empilha o "*" na pilhaT
pilhaT.push(aux);
}
break;
case '/':{
//Apenas empilha o "/" na pilhaT
pilhaT.push(aux);
}
break;
default :{
//Empilha na pilhaP a letra encontrada na pilhaI
pilhaP.push(aux);
}
break;
}
}
//Transfere o que sobrou na pilhaT para pilhaP
if(pilhaI.isEmpty()){
while(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if((tmp=='(')||(tmp=='0')){
}
else{
pilhaP.push(tmp);
}
}
}
//Inverte os valores da pilha
while(!(pilhaP.isEmpty())){
pilhaPrint.push(pilhaP.pop());
}
//Imprime a expressão de forma Pósfixa
while(!(pilhaPrint.isEmpty())){
char auxPrint=pilhaPrint.pop();
if(auxPrint=='0'){
}
else{
System.out.print(auxPrint);
}
}
Consegui terminar o programinha para converssão de uma expressão infixa para posfixa a tempo.
quero agradecer a ajuda de vcs e em especial a do nosso amigo “peczenyj”. valeu cara.
e como agradecimento ao forum segue abaixo o programinha funcionando 100% e também a pilha.
se quizerem usar o código, fiquem a vontade, mas naum esqueçam de colocar meu nome como colaborador. rsrsrsrs
abraço a todos
“Esse é o código do programa”
[code]/*
Autor: Ademir Diniz
Data: 21/10/2007
Objetivo: Ler uma expressão de forma infixa e convertê-la para forma posfixa
*/
import java.util.Scanner;
import javax.swing.JOptionPane;
public class InfPos{
public static void main(String [] args){
// Declaracao e criacao das pilhas e variaveis
Scanner scan=new Scanner(System.in);
JOptionPane janela=new JOptionPane();
Pilha pilhaT=new Pilha();
Pilha pilhaP=new Pilha();
Pilha pilhaPrint=new Pilha();
String expr;
char tmp, auxPrint, aux, auxLimp;
int tamexpr=0, i=0, opc=0;
while(opc!=2){
// Limpa as pilhas pilhaP, pilhaT e pilhaPrint
while(!pilhaP.isEmpty()){
auxLimp=pilhaP.pop();
}
while(!pilhaT.isEmpty()){
auxLimp=pilhaT.pop();
}
while(!pilhaPrint.isEmpty()){
auxLimp=pilhaPrint.pop();
}
i=0;
tamexpr=0;
// Captura a expressao e o tamanho da expressao
expr=JOptionPane.showInputDialog("CONVERTE UMA EXPRESSAO DA FORMA INFIXA PARA POSFIXA\n\nDigite a expressao de forma infixa");
System.out.print("\n\n\t\tEXPRESSAO DE FORMA INFIXA: "+expr);
tamexpr=expr.length();
// Le caractere por caractere e transforma a expressão para posfixa
while(i<tamexpr){
aux=expr.charAt(i);
i=i+1;
switch(aux){
case '(':{
pilhaT.push(aux);
}
break;
case ')':{
// Enquanto naum encontrar "(" transfere os operadores da pilhaT para pilhaP
// Quando encontrar ele para
tmp=pilhaT.pop();
while(tmp!='('){
aux=pilhaT.pop();
if(aux=='('){
pilhaP.push(tmp);
break;
}
else{
if(checaPrio(tmp)>=checaPrio(aux)){
pilhaP.push(tmp);
tmp=aux;
}
else{
pilhaP.push(aux);
tmp=pilhaT.pop();
}
}
}
}
break;
case '+':{
if(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(tmp)>=checaPrio(aux)){
pilhaP.push(tmp);
while(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(aux)==checaPrio(tmp)){
pilhaP.push(tmp);
break;
}
else{
pilhaT.push(tmp);
break;
}
}
pilhaT.push(aux);
}
else{
pilhaT.push(tmp);
pilhaT.push(aux);
}
}
else{
pilhaT.push(aux);
}
}
break;
case '-':{
if(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(tmp)>=checaPrio(aux)){
pilhaP.push(tmp);
while(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(aux)==checaPrio(tmp)){
pilhaP.push(tmp);
break;
}
else{
pilhaT.push(tmp);
break;
}
}
pilhaT.push(aux);
}
else{
pilhaT.push(tmp);
pilhaT.push(aux);
}
}
else{
pilhaT.push(aux);
}
}
break;
case '*':{
if(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(tmp)>=checaPrio(aux)){
pilhaP.push(tmp);
while(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(aux)==checaPrio(tmp)){
pilhaP.push(tmp);
break;
}
else{
pilhaT.push(tmp);
break;
}
}
pilhaT.push(aux);
}
else{
pilhaT.push(tmp);
pilhaT.push(aux);
}
}
else{
pilhaT.push(aux);
}
}
break;
case '/':{
if(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(tmp)>=checaPrio(aux)){
pilhaP.push(tmp);
while(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if(checaPrio(aux)==checaPrio(tmp)){
pilhaP.push(tmp);
break;
}
else{
pilhaT.push(tmp);
break;
}
}
pilhaT.push(aux);
}
else{
pilhaT.push(tmp);
pilhaT.push(aux);
}
}
else{
pilhaT.push(aux);
}
}
break;
default :{
// Empilha na pilhaP a letra encontrada na pilhaI
pilhaP.push(aux);
}
break;
}
}
// Transfere o que sobrou na pilhaT para pilhaP
while(!(pilhaT.isEmpty())){
tmp=pilhaT.pop();
if((tmp=='(')||(tmp=='0')){
}
else{
pilhaP.push(tmp);
}
}
// Inverte os valores da pilhaP para impressao
while(!(pilhaP.isEmpty())){
pilhaPrint.push(pilhaP.pop());
}
// Imprime a expressão de forma Pósfixa
System.out.print("\n\t\tEXPRESSAO DE FORMA POSFIXA: ");
while(!(pilhaPrint.isEmpty())){
auxPrint=pilhaPrint.pop();
if(auxPrint=='0'){
}
else{
System.out.print(auxPrint);
}
}
System.out.print("\n\n");
System.out.print("\n\t\tDESEJA CONVERTER OUTRA EXPRESSAO?");
System.out.print("\n\t\t1-Sim\t2-Nao\n\t\tEscolha um das opcoes acima e precione enter: ");
opc=scan.nextInt();
}
}
// Checa a prioridade do caracter
public static int checaPrio (char caracter){
int prioridade=0;
if(caracter=='('){
prioridade=1;
}
else{
if((caracter=='-')||(caracter=='+')){
prioridade=2;
}
else{
if((caracter=='*')||(caracter=='/')){
prioridade=3;
}
}
}
return (prioridade);
}
}[/code]
"Esse é o código do estrutura utilizada (pilha)"
[code]public class Pilha {
public char [] vet = new char [30];
public int topo = 0;
public boolean push(char dado) {
boolean res = false;
if(!isFull()) {
vet[topo] = dado;
topo++;
res = true;
}
return(res);
}
public char pop() {
char res = '0';
if(!isEmpty()) {
topo--;
res = vet[topo];
}
return(res);
}
public boolean isFull() {
boolean res = (topo == vet.length) ? true : false;
return(res);
}
public boolean isEmpty() {
boolean res = (topo == 0) ? true : false;
return(res);
}