中缀到Postfix程序。 EmptyCollectionException

时间:2013-03-06 02:47:28

标签: java algorithm stack

//这是程序抛出的异常

程序不会成功编译,它会抛出一个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;



            }



        }

1 个答案:

答案 0 :(得分:2)

我认为问题出在这一行:

while(prioridad(pila.peek())>=prioridad(e) && !pila.isEmpty()){

我认为如果你颠倒评估的顺序,它应该解决问题,因为如果第一个表达式为假,&&运算符将短路评估。这样它将检查堆栈是否为空,只有在它不为空时才查看。

尝试将!pila.isEmpty()设为第一个操作数:

while(!pila.isEmpty() && prioridad(pila.peek())>=prioridad(e)){