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 .
Example 1:
Input: "1 + 1"
Output: 2
Example 2:
Input: " 2-1 + 2 "
Output: 3
Example 3:
Input: "(1+(4+5+2)-3)+(6+8)"
Output: 23
Note:
- You may assume that the given expression is always valid.
- Do not use the
eval
built-in library function.
题目:实现一个只有加减法的计算器,输入中包含小括号、正整数、空格,返回计算的结果
思路:考察栈的题目,int栈一个存放计算数和括号,char栈存放计算符号,空格不操作。具体来说,遍历s,如若s[i]是左括号则进栈,我定义MAX代替;如果是整数且栈为空或者栈顶元素为MAX,此时数字进栈,注意扫描s时,当出现数字时,需继续向后扫描以提取多位的整数;如果是整数而栈顶元素也是整数,则取出符号栈顶元素并进行计算,将计算结果重新入栈;如果是右括号,将数字栈连续出栈两次,并将括号里面的数字入栈并检验栈顶是否需要再次计算。最后返回数字栈顶即可。
代码:
#define MAX 10000000
class Solution {
public:
int calculate(string s) {
stack<char> sign;
stack<int> number;
int size = s.size();
for(int i=0;i<size;i++){
if(s[i]=='(')
number.push(MAX); //左括号入数字栈,用MAX替代
else if(s[i]>='0'&&s[i]<='9'){ //出现数字,相后扫描获得完整数
int s_val=0;
int j;
for(j=i;s[j]>='0'&&s[j]<='9';j++){
s_val = s_val*10+s[j]-'0';
}
i=j-1; //相后多位后,更新i的值
if(number.empty()||number.top()==MAX)
number.push(s_val); //获得的整数入栈
else{ //取出符号栈顶和数字栈顶进行计算
char op = sign.top();
sign.pop();
int val=0;
if(op=='+')
val = number.top() + (s_val);
if(op=='-')
val = number.top() - (s_val);
number.pop();
number.push(val); //计算结果入栈
}
}
else if(s[i]==')'){ //相当于去除一对括号
int temp = number.top();
number.pop();
number.pop();
if(!sign.empty()){ //通过符号栈是否为空来判断去除括号后是否需要继续进行计算
char op = sign.top();
sign.pop();
int val=0;
if(op=='+')
val = number.top() + temp;
if(op=='-')
val = number.top() - temp;
number.pop();
number.push(val);
}
else
number.push(temp); //不需要计算时
}
else if(s[i]=='+'||s[i]=='-') //计算符号入栈
sign.push(s[i]);
else //空格不做处理
;
}
return number.top(); //最后只剩数字栈顶,返回即可
}
};
AC,beats 99.6%