0

//これは、プログラムがスローする例外です

プログラムは正常にコンパイルされず、EmptyCollectionException がスローされます。

スレッド「メイン」の例外 EmptyCollectionException: スタック アンダーフロー。

  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;
        
        
        
            }
    
    
    
        }
4

1 に答える 1

2

問題は次の行にあると思います。

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

&&最初の式が false の場合、演算子は評価を短絡するため、評価の順序を逆にすると問題が解決するはずです。このようにして、スタックが空でないかどうかを確認し、空でない場合にのみピークします。

!pila.isEmpty()次のように最初のオペランドを作成してみてください。

while(!pila.isEmpty() && prioridad(pila.peek())>=prioridad(e)){
于 2013-03-06T03:17:57.200 に答える