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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:33:26