2017-03-22 6 views
1

以下は、infix形式の式Stringを受け取り、それを後置式に変換する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(); 

あなたはそれを解決するには2つの方法があり、要素をポップしようとすると、スタックが空のままである:@OusmaneマーイDiawが示唆するように、あなた

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); 

        } 
       } 
      } 

これは、このうちに行って::popメソッドの前にあれば入れることができます のSystem.out.println(結果); // 4375 4 + 3の評価には正しくない* 7-5

第2のアプローチは、スタックに要素を入れてからポップする前に、アルゴリズムのロジックと必要に応じて、ここでは、あなたのロジックをチェックすることができソリューションです:

Java string-type equation double digit value issue

関連する問題