【问题标题】:Infix to Postfix program. EmptyCollectionException后缀程序的中缀。 EmptyCollectionException
【发布时间】:2013-03-06 02:47:27
【问题描述】:

//这是程序抛出的异常

程序不会成功编译,它会抛出 EmptyCollectionException。

线程“main”中的异常 EmptyCollectionException: La colección está 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;
        
        
        
            }
    
    
    
        }

【问题讨论】:

  • 为什么这会被标记在 javascript 下?
  • 对不起,这是我第一次访问该页面
  • 您的 public int prioridad(char e) 方法对 e 没有任何作用,因此它存在严重问题。它所做的只是扫描一个数组并测试其中的内容,这是没有意义的。

标签: java algorithm stack


【解决方案1】:

我认为问题出在这一行:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 2011-04-28
    • 2018-05-16
    • 2015-06-14
    • 2016-01-24
    • 2018-03-12
    • 2018-04-02
    • 2021-04-28
    相关资源
    最近更新 更多