输入字符串如何读取到基于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
相关产品推荐
相关产品推荐

