java

2010-11-21 12 views
2

ile postfix uygulamasında infix'de yanlış çıktılar al Kısa bir süre önce bir infix ifadesi alan ve bir postfix ifadesine dönüştüren bir java programı yazdım. Çoğunlukla çalışıyor ama bazı ifadeler için yanlış çıktılar alıyorum. Örneğin, a + b + c + d + e ifadesi, a b + c + d + e + çıktığında abcde +++++ değerini verir.java

import java.util.Stack; 
public class ITP { 

    public static Stack<Character> stack; 
    public static String inFixExp; 
    public static String postFixExp = ""; 

    public static String infixToPostfix(String exp){ 
     ITP o = new ITP(); 
     stack = new Stack<Character>(); 
     inFixExp = exp; 

     for (int i = 0; i < inFixExp.length(); i++) { 

      if (inFixExp.charAt(i) == '(') 
       stack.push(inFixExp.charAt(i)); 
      else if (inFixExp.charAt(i)==')'){ 
       while (stack.peek()!='('){ 
        postFixExp += stack.pop();  
       } 
       stack.pop(); 
      }else if ((inFixExp.charAt(i)=='*')||(inFixExp.charAt(i)=='/')||(inFixExp.charAt(i)=='+')||(inFixExp.charAt(i)=='-')){ 
       while(!stack.isEmpty() && o.getPredence(inFixExp.charAt(i)) < o.getPredence(stack.peek())) 
        postFixExp += stack.pop(); 
       stack.push(inFixExp.charAt(i)); 
      }else 
       postFixExp += inFixExp.charAt(i); 

     } 
     while(!stack.isEmpty()) 
       postFixExp += stack.pop(); 



     return postFixExp; 
    } 

    public int getPredence(Object op) { 

     if((op.equals("*")) || (op.equals("/"))) 
      return 3; 
     else if((op.equals("+"))||(op.equals("-"))) 
      return 1; 
     else 
      return 0; 
    } 

} 

buldum bu değiştirmek ise, bu sorunu çözer ama sonra boş bir yığın hata ve bu şekilde çıktısı hatalı bazı ifadeler, alacak hattı 24 < ile < = a + b * c ab + * olması gerektiği zaman, c + + * çıkacaktır.

cevap

1

Sizin

if ((inFixExp.charAt(i) == '*') || ... 

çekler charAt() ama String için getPredence(precedence?) denetler, bunun yerine bir char karşı karşılaştırarak deneyin.

+0

Teşekkür ederiz! Bu mükemmel şekilde sabitlendi – Thomas

+0

Rica ederim. Şahsen, nesne süper tipi kullanıcının yazım yolunu kaybetmesine neden olabileceğinden, yöntem imzalarında Object'i kullanmamayı denerim. Bununla birlikte, bu durumda bu çok alakalı değildir. –