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,结果正确 }
修复说明
- 用
istringstream按空格自动拆分所有token,不需要手动处理字符和空格,避免索引越界、重复解析的问题。 - 直接对每个token判断是运算符还是数字,
stod原生支持所有合法数字格式,不管是整数、1位小数、多位小数都能正确转换。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

