C++实现逆波兰表示法基础计算器时计算结果异常问题求助
核心问题分析
1. 字符转数值逻辑错误
C++中char类型的数字字符(如'8')直接赋值给数值类型变量时,取到的是字符对应的ASCII码值,而不是字符代表的数字本身:
- 字符
'8'的ASCII码为56,'2'的ASCII码为50,你代码中首次计算实际执行的是56 + 50 = 106,而非预期的8 + 2 = 10,这是结果异常的直接原因。 - 正确转换方式:数字字符减去
'0'即可得到对应的十进制数值,示例:input.at(0) - '0'。
2. 逆波兰表达式处理逻辑错误
你当前使用的i = i + 2步长遍历逻辑,仅适用于输入严格为「数字、数字、运算符」交替的极特殊场景,不符合标准逆波兰表达式的处理规则。标准逆波兰表达式需要使用栈结构实现计算:
- 遍历所有输入字符:
- 若为数字字符,转成数值后压入栈
- 若为运算符,弹出栈顶两个元素,用后弹出的元素对先弹出的元素执行运算,运算结果重新压入栈
- 遍历结束后,栈内剩余的唯一元素即为最终计算结果。
修正后可运行代码
#include <iostream> #include <stack> #include <string> int main() { std::string input = "82+5*8-4/"; std::stack<double> calc_stack; for (char curr_char : input) { // 判定是否为数字字符 if (curr_char >= '0' && curr_char <= '9') { calc_stack.push(curr_char - '0'); } else { // 弹出两个操作数:注意先弹的是右操作数 double right_num = calc_stack.top(); calc_stack.pop(); double left_num = calc_stack.top(); calc_stack.pop(); switch(curr_char) { case '+': calc_stack.push(left_num + right_num); break; case '-': calc_stack.push(left_num - right_num); break; case '*': calc_stack.push(left_num * right_num); break; case '/': calc_stack.push(left_num / right_num); break; default: break; } } } std::cout << calc_stack.top() << std::endl; return 0; }
运行上述代码可得到预期输出10.5。
内容的提问来源于stack exchange,提问作者IndiaCharlie
相关产品推荐
相关产品推荐

