四则运算模拟,需要考虑括号和空格
用堆栈+递归进行模拟
#include <iostream>
#include <stack>
#include <string>
#include <queue>
using namespace std;
int yunsuan(char x, int a, int b) {
int res = 0;
if (x == '+') {
res = a+b;
} else if (x == '-') {
res = a-b;
} else if (x == '*') {
res = a*b;
} else if (x == '/') {
res = a/b;
}
return res;
}
int getRes(string s) {
stack<int> num;
stack<char> f;
char flag = ' ';
for (int i=0; i<s.size(); i++) {
if (s[i] == ' ') {
continue;
} else if (s[i] == '(') {
int tmp = i++;
int sum = 1;
while(sum != 0) {
if (s[i] == '(') {
sum++;
} else if (s[i] == ')') {
sum--;
}
i++;
}
string substr = s.substr(tmp+1, i-tmp-2);
num.push(getRes(substr));
if (flag != ' ') {
int b = num.top();
num.pop();
int a = num.top();
num.pop();
num.push(yunsuan(flag, a, b));
flag = ' ';
}
i--;
}
else if (s[i] == '+' || s[i] == '-') {
f.push(s[i]);
} else if (s[i] == '*' || s[i] == '/') {
flag = s[i];
} else {
int tmp = 0;
while (s[i]>='0' && s[i]<='9') {
tmp = tmp*10;
tmp += s[i]-'0';
i++;
}
num.push(tmp);
if (flag != ' ') {
int b = num.top();
num.pop();
int a = num.top();
num.pop();
num.push(yunsuan(flag, a, b));
flag = ' ';
}
i--;
}
}
while (!f.empty()) {
int b = num.top();
num.pop();
int a = num.top();
num.pop();
num.push(yunsuan(f.top(), a, b));
f.pop();
}
return num.top();
}
int main() {
cout << getRes("3+4*(5+20/10) -7") << endl;
return 0;
}