You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:03:02