输入的格式有以下几种的数学表达式:
expr := integer;
expr := (expr)+(expr);
expr := (expr)-(expr);
要求输入的时候没有任何的空格,可以读取 "(" ")" “+”和“-”
输入和输出的数字皆为int值。字符串总长度不超过10^6个字符
输出: 输出表达式的结果,为int值
例如:
(7)-((1)+(2)) ——>输出 4
((5)+(9))-((4)-(1)) ——> 输出11
(((((995)+(166))+((-142)+(12)))-((969)+(276)))-(354))-((((-255)+((((((-170)+(-646))+(-570))-((-797)+(913)))+(((((((((852)+(858))-(179))-(-392))+((-955)-(-151)))+(-548))+(128))-(91))+(((-998)+(-119))-(((163)-(656))+(196)))))-(((767)-((454)+((-615)-((-783)+((614)-(390))))))+((((-322)-(((-249)+(691))+(707)))-((-658)-((((-238)+((912)-(893)))-(((33)+(((-853)+(488))+(-630)))+((((134)-(299))-(-601))+(-255))))-((-746)-(((1)+(-913))+(-101))))))+(((((-141)-((802)-(-891)))+(-979))+(((16)-(579))-(94)))+(337))))))-(((((313)+((696)-(2)))+(483))+(((988)+((133)+(-76)))-(662)))-(((((-288)+((792)-(-813)))-(996))+(-249))+((((((-677)-(809))-((((-753)+((-580)-((-448)-(815))))+((((-136)-((575)+(-204)))-(889))-(-645)))+((-112)-(-280))))+((((-29)+((258)-(37)))+((-419)-(650)))-(((((-370)-(-276))+(-957))-(618))-((-506)-((((-624)-(-978))+(-168))+(627))))))+(((((866)+((-200)-(-404)))+(-472))-(-641))-(-4)))-(((((707)+(588))+((-594)-(266)))-(((-469)-(754))-(497)))-((((-522)-(-672))-((((-588)+(-450))-(871))-((12)+(281))))-(369)))))))+(-650))
——>输出859
#include <iostream>
#include <stack>
using namespace std;
int calculate(string s);
int main(){
string s;
cin >> s;
int res = calculate(s);
cout << res << endl;
}
int calculate(string s) {
stack<int> ops;
ops.push(1);
int sign = 1;
int ret = 0;
int n = s.length();
int i = 0;
while (i < n) {
if (s[i] == ' ') {
i++;
} else if (s[i] == '+') {
sign = ops.top();
i++;
} else if (s[i] == '-') {
sign = -ops.top();
i++;
} else if (s[i] == '(') {
ops.push(sign);
i++;
} else if (s[i] == ')') {
ops.pop();
i++;
} else {
long num = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
num = num * 10 + s[i] - '0';
i++;
}
ret += sign * num;
}
}
return ret;
}