Java后缀表达式求值方法异常:结果与预期不符求助
问题根源与修复方案
嘿,我一眼就揪出问题所在啦!你得到2849这个离谱结果的核心原因,是把字符形式的数字直接压入栈时,存的是它们的ASCII码值,而不是实际的数字值。
为啥会算出2849?咱们走一遍错误流程:
数字字符的ASCII码是这样的:'9'=57、'2'=50、'3'=51、'4'=52,你的代码执行过程是:
- 遍历到
'9'和'2',直接push它们的ASCII码57、50 - 遇到
*:弹出50和57,计算57*50=2850,push2850 - 遇到
'3':push51;遇到+:弹出51和2850,计算2850+51=2901,push2901 - 遇到
'4':push52;遇到-:弹出52和2901,计算2901-52=2849——这就是你看到的错误结果!
修复方法:把字符转成实际数字再压栈
只需要修改数字入栈的那一行,把字符转成对应的整数,有两种简单实现方式:
- 使用
Character.getNumericValue(c)方法直接转换 - 利用数字字符ASCII码的连续性,用
c - '0'计算(比如'9'-'0'=9)
修复后的完整代码片段
public static int postFixEvaluator(String s){ NewStack stack = new NewStack(); for(int i=0; i<s.length(); i++){ char c = s.charAt(i); if(Character.isDigit(c)){ // 核心修复:将字符数字转为实际整数再入栈 stack.push(Character.getNumericValue(c)); // 也可以替换成:stack.push(c - '0'); 效果完全一致 } else { int y = stack.pop(); int x = stack.pop(); int z = 0; // 用switch更清晰处理不同运算符 switch(c){ case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x * y; break; case '/': // 额外提醒:这里可以加个除零判断,避免运行时异常 z = x / y; break; } stack.push(z); } } return stack.pop(); }
验证修复效果
现在再运行输入"92*3+4-",执行流程就完全正确了:
- push9、push2 → 遇到
*计算9*2=18,push18 - push3 → 遇到
+计算18+3=21,push21 - push4 → 遇到
-计算21-4=17,最终返回17,和手动计算结果一致!
最后小提醒:如果你的NewStack是自定义栈类,要确保它的push和pop方法能正确处理int类型(比如内部存储的是Integer或int数组),避免类型转换的坑~
内容的提问来源于stack exchange,提问作者Madiha
相关产品推荐
相关产品推荐

