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

C++实现evaluateCountdown处理带小数的RPN表达式返回结果错误

问题根因

  • 数字解析逻辑硬编码仅截取当前索引后3个字符作为数字,且处理完数字后未跳过已处理的索引位,导致同一个数字的小数点、末尾数会被重复作为新数字开头解析,大量无效值被压入栈打乱运算序列,最终结果错误。
  • 整数表达式能返回正确结果仅为巧合:单字符整数搭配空格的场景下,错误解析产生的异常值刚好没有干扰到最终运算逻辑,属于不可复现的偶然情况。

修复方案

推荐先将输入按空格拆分出独立token再逐个处理,逻辑更清晰,兼容性也更强:

#include <string>
#include <sstream>
#include <stack>
#include <iostream>
using std::string;
using std::cout;
using std::stack;
using std::endl;
using std::stod;
using std::istringstream;

double evaluateCountdown(string & tokens) {
    stack<double> stk;
    istringstream iss(tokens);
    string token;
    // 按空格拆分token逐个处理
    while (iss >> token) {
        if (token == "+" || token == "-" || token == "*" || token == "/") {
            double val1 = stk.top();
            stk.pop();
            double val2 = stk.top();
            stk.pop();
            if (token == "+") stk.push(val2 + val1);
            else if (token == "-") stk.push(val2 - val1);
            else if (token == "*") stk.push(val2 * val1);
            else if (token == "/") stk.push(val2 / val1);
        } else {
            // 直接转double,兼容任意合法数字格式(整数、多位数、小数都支持)
            stk.push(stod(token));
        }
    }
    return stk.top();
}

int main() {
    string s = "3.0 4.0 - 2.0 *";
    double ans = evaluateCountdown(s);
    cout << ans << endl; // 输出-2,结果正确
}

修复说明

  1. 用istringstream按空格自动拆分所有token,不需要手动处理字符和空格,避免索引越界、重复解析的问题。
  2. 直接对每个token判断是运算符还是数字,stod原生支持所有合法数字格式,不管是整数、1位小数、多位小数都能正确转换。

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:27:06