1 题目及要求
1.1 题目描述
含有加减乘除四则运算以及括号的表达式(字符串),求该表达式的结果。
2 解答
2.1 题目分析
分解为简单的几个步骤,然后依次解决。
2.2 代码
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
// 计算单个运算符
double uniOp(double x1, double x2, char op) {
switch (op) {
case '*':return x1*x2;
case '/':return x2 ? x1 / x2 : x1;
case '+':return x1 + x2;
case '-':return x1 - x2;
}
return x1;
}
// 计算不含括号的算式
double compute(const string &s) {
istringstream ss(s);
double res(0), tmp1, tmp2;
char op1, op2;
if (!(ss >> res && ss >> op1 && ss >> tmp1)) return res;
while (ss >> op2 && ss >> tmp2) {
if (op1 == '*' || op1 == '/' || op2 == '+' || op2 == '-') {
res = uniOp(res, tmp1, op1);
tmp1 = tmp2;
op1 = op2;
}
else {
tmp1 = uniOp(tmp1, tmp2, op2);
}
}
return uniOp(res, tmp1, op1);
}
// 计算含括号的算式
double compute2(const string &s) {
auto it2 = s.begin(), it1 = it2;
for (;it2 != s.end();++it2) {
if (*it2 == ')') break;
if (*it2 == '(') it1 = it2;
}
if (it2 == s.end()) return compute(s);
string s2 = s.substr(0, it1 - s.begin());
s2 += to_string(compute(s.substr(it1 - s.begin()+1, it2 - it1)));
s2 += s.substr(it2 - s.begin() + 1);
return compute2(s2);
}
int main(int argc, char *argv[]) {
string s1 = "((1+2)*3/((4-2)*2)+(2))";
cout << compute2(s1);
return 0;
}