C++如何实现字符串四则运算表达式计算 正确处理运算符优先级
问题根因
你现有代码存在两个核心问题,导致无法得到正确结果:
- 数字提取逻辑完全错误:你定义的
numbers是单个int值,且直接将字符的ASCII码累加,既无法识别10、20这类多位数,也拿不到字符对应的真实数值(字符'0'的ASCII值为48,和数值0完全不等) - 未实现运算优先级逻辑:四则运算中乘除优先级高于加减,即便你正确拆分了数字和运算符,按从左到右顺序计算也会把
10+20*5算成150,不符合预期。
实现方案
不需要引入复杂的解析库,按三步实现即可兼容整数四则运算场景:
- 正确拆分Token:遍历字符串时连续拼接数字字符,转成真实整数值存入数字数组,遇到运算符单独存入运算符数组,遍历结束后补存最后一个数字
- 优先处理乘除:遍历运算符数组,遇到
*//时立刻计算对应位置两个数的结果,替换原数组中的两个数为计算结果,同时移除已处理的运算符,这一轮处理完后所有剩余运算均为加减 - 顺序处理加减:从左到右遍历剩余的加减运算符,累计计算得到最终结果
修正后可运行代码
#include <string> #include <vector> #include <cctype> using namespace std; int calculateFromString(string equation) { vector<int> nums; vector<char> ops; int currentNum = 0; // 拆分数字与运算符 for (char c : equation) { if (isdigit(c)) { // 多位数拼接:当前累计值*10 加 当前位的真实数值 currentNum = currentNum * 10 + (c - '0'); } else { nums.push_back(currentNum); currentNum = 0; ops.push_back(c); } } nums.push_back(currentNum); // 存入最后一个数字 // 第一遍计算:处理高优先级的乘除 for (int i = 0; i < ops.size(); i++) { if (ops[i] == '*' || ops[i] == '/') { int calcRes; if (ops[i] == '*') { calcRes = nums[i] * nums[i+1]; } else { calcRes = nums[i] / nums[i+1]; // 默认为整数除法,需要小数可将存储类型改为float/double } // 替换原位置数值,移除已处理的数和运算符 nums[i] = calcRes; nums.erase(nums.begin() + i + 1); ops.erase(ops.begin() + i); i--; // 元素移位后回退索引,避免漏算 } } // 第二遍计算:处理剩余加减 int finalRes = nums[0]; for (int i = 0; i < ops.size(); i++) { if (ops[i] == '+') { finalRes += nums[i+1]; } else { finalRes -= nums[i+1]; } } return finalRes; }
测试验证
传入你给出的测试用例运行结果符合预期:
#include <iostream> int main() { cout << calculateFromString("10+20*5") << endl; // 输出110 cout << calculateFromString("10+20") << endl; // 输出30 cout << calculateFromString("100-20/4") << endl; // 输出95 return 0; }
内容的提问来源于stack exchange,提问作者Cohen
相关产品推荐
相关产品推荐

