我在if-else循环中得到java.util.EmptyStackException。堆栈实现在哪里出错?

时间:2017-03-22 15:44:04

标签: java stack

下面是一个java代码,它接受中缀格式的表达式String并将其转换为后缀格式。

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

                }



    }

1 个答案:

答案 0 :(得分:0)

问题出在这一行:

p = st.pop(); 
当你试图弹出一个元素时,堆栈仍然是空的,有两种方法可以解决它:正如@Ousmane Mahy Diaw建议的那样,你可以在pop方法之前放一个if:

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(结果); // 4375对于4 + 3 * 7-5

的评估,这不是正确的

第二种方法是:在弹出它们之前将一个元素放入堆栈中,它取决于算法的逻辑和您的需求,这是一个可以检查逻辑的解决方案:

Java string-type equation double digit value issue