【问题标题】:I am getting java.util.EmptyStackException in an if-else loop. Where is the stack implementation going wrong?我在 if-else 循环中得到 java.util.EmptyStackException。堆栈实现哪里出错了?
【发布时间】:2017-03-23 00:14:27
【问题描述】:

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

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

                }



    }

【问题讨论】:

  • 解决方案很简单,除非你知道还有一些物品,否则不要 pop(),即在弹出之前检查 size()。

标签: java stack


【解决方案1】:

问题出在这一行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2012-05-30
    • 2014-05-09
    • 2011-06-07
    • 1970-01-01
    • 2011-11-09
    • 2010-10-11
    相关资源
    最近更新 更多