问题描述
在编写应用程序时,我需要执行输入的算术运算。词法分析器部分以中缀表示法返回算术表达式,而要执行进一步的操作,最好使用后缀(反向波兰语)表示法。通常,我需要一个堆栈,其中紧跟在操作符号之后的参数将是应该应用该操作的参数,可能是嵌套的。
我写了我想到的最简单的翻译实现,但出现错误,只是找不到来源。
给出显式错误的输入示例:1+2*3-4/(5*6)
我的实现输出是:12+3*4-56*/
正确的必须是:123*+456*/-
这是主要代码,它使用带有源数据的中缀 Stack
和后缀 StringBuilder
作为答案:
for (int i = 0; i < element.length(); i++) {
char st = element.charat(i);
if (!(st == ' ' || st == ',')) {
if (st == '+' || st == '-' || st == '*' || st == '/') {
while (!infix.isEmpty() && infix.peek() != '(' && operatorWeight(infix.peek()) >= operatorWeight(st)) {
postfix.append(infix.pop());
}
infix.push(st);
} else if (st >= '0' && st <= '9') {
postfix.append(st);
} else if (st == '(') {
infix.push(st);
} else if (st == ')') {
while (!infix.isEmpty() && infix.peek() != '(') {
postfix.append(infix.pop());
}
infix.pop();
}
}
}
while (!infix.isEmpty() && infix.peek() != '(') {
postfix.append(infix.peek());
infix.pop();
}
public int operatorWeight(char st) {
int weight = -1;
switch (st) {
case '+':
case '-':
weight = 0;
case '*':
case '/':
weight = 1;
}
return weight;
}
可能被条件搞砸了
解决方法
您在运算符比较开关块中缺少 break 语句。
public int operatorWeight(char st) {
int weight = -1;
switch (st) {
case '+':
case '-':
weight = 0;
break;
case '*':
case '/':
weight = 1;
break;
}
return weight;
}