我已经完成了后缀表达式计算器的代码,但是当我遇到负号时,我不确定如何评估表达式。
例如,表达式:-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() + "";
}
答案 0 :(得分:2)
如果您已经将其标记为&amp;来自MINUS(二元运算符)的区分SIGN(一元),这已经在后缀中,并且已经在堆栈上推送了值 - 这似乎都属于这种情况 -
这很简单:
else if (type == TokenType.SIGN) {
int x = stack.pop();
x = -x;
stack.push( x);
}
关闭NUMBER字面值,取消它,然后将结果推回堆栈。一元运算符==&gt;堆栈中的一个输入,一个输出重新打开。
答案 1 :(得分:-1)
您需要推送其他运营商。解析表达式时,您可以判断它是一元还是二元减号,并且您需要在反向波兰表示法中保留它。所以你需要一个单独的运算符来减去一元。