抱歉我缺乏英语技能。
我想做一个字符串中指定的算术运算,例如“1 + 3 * 11 - 7/18”。
乘法和除法的优先级高于加法和减法。在具有相同优先级的操作的情况下,操作按从左到右的顺序执行。
我编写了计算加法的代码。但我无法进入下一步。
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cout << "Enter an arithmetic operation EX) 1 + 3 * 11 + 7 / 18 " << endl;
getline(cin, s, '\n');
int sum = 0;
int search = 0;
while(true) {
int plus = s.find('+', search);
if(plus == -1) {
string aos = s.substr(search);
if(aos == "") break;
cout << aos << endl;
sum += stoi(aos);
break;
}
int count = plus - search;
string aos = s.substr(search, count);
cout << aos << endl;
sum += stoi(aos);
search = plus+1;
}
cout << "Result is " << sum;
}
答案 0 :(得分:0)
没有内置的方法来解析和评估字符串。您需要编写自己的代码才能执行此操作。
通常,表达评估分两步进行:
<强>扫描即可。不要使用单个字符串,而是将输入分成单个单元,称为标记。例如,字符串5 * 3 + 2
可能会变成序列["5", "*", "3", "+", "2"]
。通过提前执行此步骤,您可以更轻松地使用以后的数量,因为不需要进行大量复杂的字符串处理。
<强>评价即可。给定令牌序列,确定表达式的计算结果。
您正在采取的方法 - 寻找操作员并对其进行评估 - 可以起作用。您将首先要搜索最高优先级运算符以进行评估。例如,在字符串5 * 3 + 2
中,您需要在5 * 3
之前评估3 + 2
。
但是,还有其他更快更清洁的方法。 Dijkstra的shunting-yard algorithm使用两个堆栈来计算表达式,并且编码相对简单。我建议从那里开始 - 每次我需要手工制作表达评估员时,我都转向这种特殊方法。
还有其他重量级选项。您可以在线查找表达式解析库,也可以使用flex
和bison
之类的工具自动生成解析器。不过,我怀疑你的需求太过分了。