描述
实现一个基本的计算器来计算一个简单的表达式字符串。
表达式字符串可以包含左括号 (和右括号 )、加号+或减号-、non-negative 整数和空格。
表达式字符串只包含非负整数、+, -, *, /操作符、左括号 (,右括号 )和空格。
您可以假设给定的表达式总是有效的。所有中间结果将在“[-2147483648,2147483647]”范围内。
样例
“1 + 1” = 2
" 6-4 / 2 " = 4
“2*(5+52)/3+(6/2+8)" = 21
"(2+6 3+5- (3*14/7+2)*5)+3”=-12
思路
使用2个栈分别存储数和操作符,根据优先级进行操作
代码
class Solution {
public:
/**
* @param s: the given expression
* @return: the result of expression
*/
int precede(char a, char b) {
if ((a == '(' && b == ')') || (a == '#' && b == '#'))
return 0;
if (a == '(' || a == '#' || b == '(')
return -1;
if (a == ')' || b == '#' || b == ')')
return 1;
if (a == '+' || a == '-')
return (b == '+' || b == '-') ? 1 : -1;
if (a == '*' || a == '/')
return 1;
}
int oper(int a, int b, char c) {
if (c == '+')
return a + b;
if (c == '*')
return a * b;
if (c == '-')
return b - a;
if (c == '/')
return b / a;
}
int vector2int(vector<int> tar) {
int res = 0;
for (int i = 0; i < tar.size(); i++) {
res += tar[i] * pow(10, tar.size() - i - 1);
}
return res;
}
int calculate(string &s) {
// Write your code here
s.push_back('#');
stack<char> optr;
stack<int> opnd;
optr.push('#');
for (int i = 0; i < s.length(); i++) {
int temp = s[i] - '0';
if (s[i] == ' ')
continue;
if (s[i] - '0' <= 9 && s[i] - '0' >= 0) {
vector<int> integer;
while (s[i] - '0' <= 9 && s[i] - '0' >= 0) {
integer.push_back(s[i] - '0');
i++;
}
i--;
opnd.push(vector2int(integer));
}
else {
int flag = precede(optr.top(), s[i]);
if (flag == 0)
optr.pop();
else if (flag == -1)
optr.push(s[i]);
else {
int a = opnd.top();
opnd.pop();
int b = opnd.top();
opnd.pop();
char c = optr.top();
optr.pop();
opnd.push(oper(a,b,c));
i--;
}
}
}
return opnd.top();
}
};