gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:20 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com