Infix 符号在 Postfix 转换器中的错误
Mistake in Infix notation into Postfix converter
在编写应用程序时,我面临着需要执行输入的算术运算。词法分析器部分 returns 中缀表示法的算术表达式,而要执行进一步的操作,最好使用后缀(反向波兰语)表示法。通常,我需要一个堆栈,其中在操作符号之后紧接着是应该应用该操作的参数,可能是嵌套的。
我写了一个想到的最简单的翻译实现,但是出错了,就是找不到出处。
给出显式错误的输入示例: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;
}
在编写应用程序时,我面临着需要执行输入的算术运算。词法分析器部分 returns 中缀表示法的算术表达式,而要执行进一步的操作,最好使用后缀(反向波兰语)表示法。通常,我需要一个堆栈,其中在操作符号之后紧接着是应该应用该操作的参数,可能是嵌套的。
我写了一个想到的最简单的翻译实现,但是出错了,就是找不到出处。
给出显式错误的输入示例: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;
}