如何评估后缀表达式中的符号?

时间:2013-08-01 02:12:56

标签: java

我已经完成了后缀表达式计算器的代码,但是当我遇到负号时,我不确定如何评估表达式。

例如,表达式:-1-2-3 在我的程序中出现如下:

原始= -1-2-3

中缀标记= [[ - ; SIGN],[1; NUM],[ - ; OP],[2; NUM],[ - ; OP],[3; NUM]]

Postfix = [[1; NUM],[ - ; SIGN],[2; NUM],[ - ; OP],[3; NUM],[ - ; OP]]

后缀评估= -2

显然答案应该是-6,但是我无法看到在数字应用于整个表达式之前实际制作符号的逻辑。我相信我的postfix方法是正确的,我知道我需要在看到标志时创建一个案例,但我不知道在那之后该怎么做。

到目前为止,这是我的代码:

public static String eval(ArrayList<Tokenize.Token> list) {  
     Stack<Integer> stack = new Stack<Integer>(); 

     for (int i=0; i<list.size(); i++) { 
        Tokenize.Token t = list.get(i); 
        TokenType type = t.getType();



        if (type==TokenType.NUM) { 
                String x = t.getValue();
                int x1 = Integer.parseInt(x);
                stack.push(x1);
        } 

        else if (type==TokenType.OP) {

                int y = stack.pop();
                int x = stack.pop();

                if(t.getValue().equals("*")) {
                    int z = y * x;
                    stack.push(z);
                }
                else if(t.getValue().equals("/")) {
                    int z = y / x;
                    stack.push(z); 
                }
                else if(t.getValue().equals("+")) {
                    int z = y + x;
                    stack.push(z);
                }
                else if(t.getValue().equals("-")) {
                    int z = y - x;
                    stack.push(z);
                }
        } 

        else if(type == TokenType.SIGN) { 
        //????                 
            } 
     } 
     return stack.pop() + ""; 
  }

2 个答案:

答案 0 :(得分:2)

如果您已经将其标记为&amp;来自MINUS(二元运算符)的区分SIGN(一元),这已经在后缀中,并且已经在堆栈上推送了值 - 这似乎都属于这种情况 -

这很简单:

else if (type == TokenType.SIGN) { 
    int x = stack.pop();
    x = -x;
    stack.push( x);
} 

关闭NUMBER字面值,取消它,然后将结果推回堆栈。一元运算符==&gt;堆栈中的一个输入,一个输出重新打开。

答案 1 :(得分:-1)

您需要推送其他运营商。解析表达式时,您可以判断它是一元还是二元减号,并且您需要在反向波兰表示法中保留它。所以你需要一个单独的运算符来减去一元。