1

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

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

原始 = -1-2-3

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

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

后缀评估 = -2

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

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

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() + ""; 
  }
4

2 回答 2

2

前提是您已经将 SIGN(一元)与 MINUS(二元运算符)进行了标记和区分,并且这已经在后缀中,并且该值已经被推送到堆栈上——这一切似乎都是如此——

这很简单:

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

您将 NUMBER 文字弹出,取反,然后将结果推回堆栈。一元运算符 ==> 一个输入离开堆栈,一个输出返回。

于 2013-08-01T02:28:47.960 回答
-1

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

于 2013-08-01T02:16:32.590 回答