一、题目描述
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open (
and closing parentheses )
, the plus +
or minus sign -
, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
Some examples:
"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23
Note: Do not use the eval
built-in library function.
思路:设计两个栈number、symbol,number用来存数字,symbol用来存符号('+' '-' '(' ')')
逻辑如下:输入为一个字符串s,对于一个字符s[i]
(1)如果s[i]是空格,就i++
(2)如果s[i]是数字,计算出数字是多少(注意多位数的情况),然后将数字放入number中
(3)如果s[i]是'+' 或者 '-',判断symbol的栈顶是否是'+' 或者 '-',如果是就先计算,然后再将s[i]添加进symbol
(4)如果s[i]是'(',直接添加进symbol
(5)如果s[i]是')',计算直到symbol中遇到'(',弹出'('
c++代码(26ms):
class Solution {
public:
int calculate(string s) {
int len=s.size();
stack<int> number; //存储数字
stack<char> symbol; //存储运算符号:+ - ( )
int i=0;
while(i<len){
if(s[i] == ' '){
//如果是空格
i++;
while(i<len && s[i] == ' ')
i++;
}else if(s[i] >= '0' && s[i] <= '9'){
//如果是数字,注意要考虑多位数
int tmp=s[i] - '0';
i++;
while(i<len && s[i] >= '0' && s[i] <= '9'){
tmp=tmp*10+(s[i]-'0');
i++;
}
number.push(tmp);
}else if(s[i] == '+' || s[i] == '-'){
if(!symbol.empty() && symbol.top() == '+'){
int tmp2 = number.top();
number.pop();
int tmp1 = number.top();
number.pop();
number.push(tmp1 + tmp2);
symbol.pop(); //弹出'+'
symbol.push(s[i]); //加入新符号
}else if(!symbol.empty() && symbol.top() == '-'){
int tmp2 = number.top();
number.pop();
int tmp1 = number.top();
number.pop();
number.push(tmp1 - tmp2);
symbol.pop(); //弹出'-'
symbol.push(s[i]); //加入新符号
}else{
symbol.push(s[i]);
}
i++;
}else if(s[i] == '('){
symbol.push(s[i]);
i++;
}else if(s[i] == ')'){
//计算,直到遇到'('
if(symbol.top() == '+'){
int tmp2 = number.top();
number.pop();
int tmp1 = number.top();
number.pop();
number.push(tmp1 + tmp2);
symbol.pop(); //弹出'+'
symbol.pop(); //弹出'('
}else if(symbol.top() == '-'){
int tmp2 = number.top();
number.pop();
int tmp1 = number.top();
number.pop();
number.push(tmp1 - tmp2);
symbol.pop(); //弹出'-'
symbol.pop(); //弹出'('
}else{
symbol.pop(); //弹出'('
}
i++;
}
}//for
if(!symbol.empty()){
int tmp2 = number.top();
number.pop();
int tmp1 = number.top();
number.pop();
if(symbol.top() == '+'){
return tmp1 + tmp2;
}else{
return tmp1 - tmp2;
}
}
return number.top();
}
};