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

输入字符串如何读取到基于shunting yard算法的计算器中?

调度场算法多位数与函数名解析方案

现有单字符遍历逻辑调整为按token类型批量读取即可,核心修改逻辑如下:

  • 遍历过程不固定每次步长为1,根据当前字符类型动态调整读取长度
  • 读到数字/小数点时,持续向后拼接所有连续的数字、小数点,得到完整多位数
  • 读到字母时,持续向后拼接所有连续的字母,得到完整的函数名(如sin、log)或常量名(如pi)
  • 运算符、括号等单字符符号仍按单个读取即可

修改后的参考代码:

string input;
getline(cin, input);
input.erase(remove_if(input.begin(), input.end(), ::isspace), input.end());

int len = input.length();
for (int i = 0; i < len; ++i) {
    // 处理多位数
    if (isdigit(input[i]) || input[i] == '.') {
        string num_str;
        while (i < len && (isdigit(input[i]) || input[i] == '.')) {
            num_str += input[i];
            i++;
        }
        i--; // 回退一位避免外层循环多跳
        // 此处处理数值token:可转为double后压入输出队列
        continue;
    }
    // 处理函数名
    if (isalpha(input[i])) {
        string func_str;
        while (i < len && isalpha(input[i])) {
            func_str += input[i];
            i++;
        }
        i--;
        // 此处处理函数token:匹配内置函数名后压入运算符栈
        continue;
    }
    // 处理单字符运算符、括号
    string s = input.substr(i, 1);
    // 原有单字符处理逻辑保留即可
}

若需要支持负数标记(如表达式开头的-、括号后的-),可额外补充判断:当-出现在输入开头、前一个字符是运算符、前一个字符是左括号时,判定为负号而非减号,直接和后续数字拼接即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:24:04