后缀表达式求值:switch运行正常,if-else输出错误的原因?
后缀表达式求值代码问题解析
你在实现后缀表达式求值时遇到的问题,核心原因是独立if语句中的break会直接终止外层的for循环,导致表达式未完全处理;而switch语句中的break仅终止switch块,不会中断for循环的执行。
错误代码(多独立if版本)
public static int evaluatePostFix(String S) { Stack<Integer> s = new Stack<>(); int n = S.length(); for(int i = 0 ; i < n; i ++){ char c = S.charAt(i); if(c >= '0' && c <= '9'){ // 处理操作数 int temp = (int)(c - '0'); s.push(temp); }else{ // 处理运算符 int op1 = s.pop(); int op2 = s.pop(); if(c == '+'){ s.push(op2 + op1); break; // 此处break会直接跳出外层for循环 } if(c == '-'){ s.push(op2 - op1); break; // 同上,触发后终止整个循环 } if(c == '*'){ s.push(op2 * op1); break; } if(c == '/'){ s.push(op2 / op1); break; } } } return s.peek(); }
正确代码(switch版本)
switch(c){ case '+': s.push(op2 + op1); break; // 仅跳出switch块,for循环继续执行 case '-': s.push(op2 - op1); break; case '*': s.push(op2 * op1); break; case '/': s.push(op2 / op1); break; }
原因详解
- 在多独立if的代码中,每个if分支里的
break没有标签,会匹配到最近的循环结构(也就是外层的for循环)。这意味着只要遇到第一个运算符,执行完计算后就会直接终止整个for循环,后缀表达式中剩下的字符完全不会被处理,自然无法得到正确结果。 - 而switch语句中的
break作用范围仅局限于当前switch块,执行完对应运算符的计算后,break只会跳出switch,外层的for循环会继续迭代,处理表达式中的下一个字符,直到整个后缀表达式被完整计算。
内容的提问来源于stack exchange,提问作者jjp
相关产品推荐
相关产品推荐

