java - 我在 if-else 循环中收到 java.util.EmptyStackException 。堆栈实现哪里出了问题?

标签 java stack

下面是一段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);

                }



    }

最佳答案

问题出在这一行:

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

关于java - 我在 if-else 循环中收到 java.util.EmptyStackException 。堆栈实现哪里出了问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956459/

相关文章:

c++ - 推送到自定义堆栈类卡住 .exe

java - 我的 Stack 类中的 Pop 或 Push 方法是否写得不正确?

c - 从输入参数声明自动变量的数组大小

python - 在 python 中使用链表实现堆栈。 pop 方法的问题和有关可变性的问题

java - log4j:WARN 找不到记录器的附加程序(运行 jar 文件,而不是 Web 应用程序)

Java 正则表达式与预期不匹配

Websphere 9.0 中的 Java 文件

java - 如何在 twitter4j 中传递用户名和密码?

java - List<T> 上的通用类型兼容性错误,其中 T 是接口(interface)

linux - 用于了解可执行文件的文本、BSS 等字段的命令