函数中缀到postfix无法正常工作

时间:2014-11-19 04:39:26

标签: java

我有下一个代码将aritmethic表达式从中缀转换为posfix,例如: 2 *(23 + 6)-1,在函数e中,堆栈p已经包含表达式

public static void e(){
        String exp;
        Stack<String> p = new Stack<String>();
        exp = posFija(p);
        System.out.println(" "+exp);
    }

以下是应该进行转换的两个函数:

public static String posFija(Stack<String> p){
        String posFix = "";
        Stack<String> temp = new Stack<String>();
        Stack<String> s = new Stack<String>();      
        try
        {
            while(!p.isEmpty())
            {   
                switch(pref(p.peek())){
                    case 1:  
                       temp.push(p.pop());
                       break;
                    case 3:
                    case 4:
                       while(pref(temp.peek()) >= pref(p.peek()))
                           s.push(t.pop());
                       temp.push(p.pop());
                       break;
                    case 2:
                       while(!temp.peek().equals("("))
                       {
                          s.push(temp.pop());
                       }
                       temp.pop();
                       p.pop();
                       break;
                    default:
                       s.push(p.pop());
                }
            }
            posFix = s.toString();
        }
        catch(Exception ex)
        {
            System.out.println("Error");
        }
        return posFix;
    }
    private static int pref(String op) {
        int prf = 99;
        if (op.equals("^"))
           prf = 5;
        if (op.equals("*") || op.equals("/")) 
           prf = 4;
        if (op.equals("+") || op.equals("-")) 
           prf = 3;
        if (op.equals(")"))
           prf = 2;
        if (op.equals("("))
           prf = 1;
        return prf;
      }

我遇到的问题是,当开关找到“)”(表达式为2 *(23 + 6)-1)时,它会抛出异常,我不知道如何解决这个问题

1 个答案:

答案 0 :(得分:0)

下面的代码将适用于它。请查看我在其中所做的更改。

public static void e() {
    String exp;
    Stack<String> p = new Stack<String>();
    // 2*(23+6)-1
    p.push("1"); //Pushing for right to left, or you can reverse stack in posFija if you are pushing from left to right
    p.push("-");
    p.push(")");
    p.push("6");
    p.push("+");
    p.push("23");
    p.push("(");
    p.push("*");
    p.push("2");

    exp = posFija(p);
    System.out.println(" " + exp);
}

temp的空检查和最后一个元素添加到s

public static String posFija(Stack<String> p) {
    String posFix = "";
    Stack<String> temp = new Stack<String>();
    Stack<String> s = new Stack<String>();
    try {
        while (!p.isEmpty()) {
            switch (pref(p.peek())) {
            case 1:
                temp.push(p.pop());
                break;
            case 3:
            case 4:
                while (!temp.empty() && pref(temp.peek()) >= pref(p.peek())) //Empty check
                    s.push(temp.pop());
                temp.push(p.pop());
                break;
            case 2:
                while (!temp.peek().equals("(")) {
                    s.push(temp.pop());
                }
                temp.pop();
                p.pop();
                break;
            default:
                s.push(p.pop());
            }
        }
        //For last element in temp
        if (!temp.isEmpty() && !temp.peek().equals(")")) {
            s.push(temp.pop());
        }
        posFix = s.toString();
        //System.out.println("S: " + s);
        //System.out.println("P: " + p);
        //System.out.println("Temp: " + temp);
    } catch (Exception ex) {
        System.out.println("Error");
        ex.printStackTrace();
    }
    return posFix;
}

pref方法中,使用if-else if-else if代替if-if-if