2017-03-22 21 views
1

下面是一個java代碼,它接受中綴格式的表達式字符串並將其轉換爲後綴格式。我在if-else循環中得到java.util.EmptyStackException。堆棧實現在哪裏出錯?

package post; 
import java.util.Stack; 

public class InfixtoPostfix 
{ 
    void convert(String expression) 
    { 
    Stack<Character> st=new Stack<Character>(); 
    char c;char p;char e; 
    int pr;int f; 
    int flag1=0; 
    String result=new String(); 
    int i=0; 
    int len=expression.length(); 
    while(len>0) 
    { 
     if(expression.charAt(i)!='+'&&expression.charAt(i)!='-'&&expression.charAt(i)!='*'&&expression.charAt(i)!='/') 
     { 
      result=result+(String.valueOf(expression.charAt(i))); 
     } 
     else if(expression.charAt(i)=='(') 
     { 
      st.push(expression.charAt(i)); 
     } 
     else if(expression.charAt(i)==')') 
     { 

      c=st.pop(); 
      while((st.size()>0) || (c!='(')) 
      { 
       result=result+c; 
       c=st.pop(); 
      } 
     } 


    else if(expression.charAt(i)=='+'||expression.charAt(i)=='-'||expression.charAt(i)=='*'||expression.charAt(i)=='/') 
    { 
       c=expression.charAt(i); 
       p=st.pop(); 
       pr=precedence(c,p); 
       if(pr==0) 
       { 

        result=result+p; 
        st.push(c); 


       } 
       else 
       { 
        st.push(p); 
        st.push(c); 

       } 



    } 


len--;i++;  
    } 


    System.out.println(result); 
} 



int precedence(char op1,char op2) 
{ 
    int b=0; 
    if((op1=='+'||op1=='-')&&(op2=='*'||op2=='/')) 
    { 
    b=0; 
    } 
    else if(op1=='*' && op2=='/') 
    { 
    b=0; 
    } 
    else if(op1=='/' && op2=='*') 
    { 
    b=1; 
    } 
    else if(op1=='+' && op2=='-') 
    { 
    b=1; 
    } 
    else if(op1=='+' && op2=='-') 
    { 
    b=1; 
    } 
return b; 
} 


    public static void main(String[] args) 
    { 
     InfixtoPostfix object=new InfixtoPostfix(); 
     object.convert("4+3*7-5"); 
    } 

} 

以下代碼部分來自整個代碼的註釋時,不會遇到任何錯誤。當這個特定的代碼段被解除註釋時,發生java.util.EmptyStackException錯誤:

在下面的代碼段中,堆棧實現發生了什麼問題?

else if(expression.charAt(i)=='+'||expression.charAt(i)=='- '||expression.charAt(i)=='*'||expression.charAt(i)=='/') 
    { 
       c=expression.charAt(i); 
       p=st.pop(); 
       pr=precedence(c,p); 
       if(pr==0) 
       { 

        result=result+p; 
        st.push(c); 


       } 
       else 
       { 
        st.push(p); 
        st.push(c); 

       } 



    } 
+0

解決方法很簡單,不彈出(),除非你知道有一些項目左即檢查大小()你彈出之前。 –

回答

0

的問題是在這條線:

p = st.pop(); 

堆棧仍然是空的,當您嘗試流行的元素,也有解決它有兩種方式:作爲@Ousmane梅伊迪奧建議,你可以在彈出方法之前把一個如果:

else if (expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*' || expression.charAt(i) == '/') { 
       c = expression.charAt(i); 
       if (!st.isEmpty()) { 
        p = st.pop(); 
        pr = precedence(c, p); 
        if (pr == 0) { 

         result = result + p; 
         st.push(c); 

        } else { 
         st.push(p); 
         st.push(c); 

        } 
       } 
      } 

這傳導到了這一點: 的System.out.println(結果);第二種方法是:在堆棧中放入一個元素以便彈出它們,這取決於您的算法邏輯和您的需求,這裏要說的是,你可以檢查你的邏輯的解決方案:

Java string-type equation double digit value issue