//这是程序抛出的异常
程序不会成功编译,它会抛出一个EmptyCollectionException。
线程“main”中的异常EmptyCollectionException:Lacolecciónestávacía: 堆栈下溢。
at ArrayStack.peek(ArrayStack.java:57) at Convertidor.convierte(Convertidor.java:58) at postfix.main(postfix.java:20)
Java结果:1
public class Convertidor {
//This method will calculate the priority of the operators.
public int prioridad(char e){
int p, prioridad;
char ch;
prioridad=0;
char[] operadores = new char[] { '+', '-', '*', '/','^' };
for(p=0;p<operadores.length;p++){
ch=operadores[p];
if(p=='+'||p=='-')
prioridad=1;
if(p=='/'||p=='*')
prioridad=2;
if(p=='^')
prioridad=3;
}
return prioridad;
}
public String convierte(String entrada){
String salida="";
String resp;
char e,r,ch;
String n;
n="";
int i, pri,p;
pri=0;
StringBuffer buff=new StringBuffer();
ArrayStack<Character> pila=new ArrayStack<Character>();
while(!entrada.equals(null)){
for(i=0;i<entrada.length();i++){
e=entrada.charAt(i);
if(Character.isDigit(e)){
buff.append(salida);
buff.append(e);
}
else
if(e=='(')
pila.push(e);
else
if(e==')'){
while(!pila.isEmpty()&&!pila.peek().equals('(')){
n=pila.pop().toString();
buff.append(n);
buff.append("");
}
}
if(e=='+'||e=='-'||e=='*'||e=='/'||e=='^'){
while(prioridad(pila.peek())>=prioridad(e)&&!pila.isEmpty()){
buff.append(pila.pop());
}
pila.push(e);
}
}
while(!pila.isEmpty()){
buff.append(pila.pop());
}
}
salida=buff.toString();
return salida;
}
}
答案 0 :(得分:2)
我认为问题出在这一行:
while(prioridad(pila.peek())>=prioridad(e) && !pila.isEmpty()){
我认为如果你颠倒评估的顺序,它应该解决问题,因为如果第一个表达式为假,&&
运算符将短路评估。这样它将检查堆栈是否为空,只有在它不为空时才查看。
尝试将!pila.isEmpty()
设为第一个操作数:
while(!pila.isEmpty() && prioridad(pila.peek())>=prioridad(e)){