224. Basic Calculator
problem description
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.
algorithm thought
基本计算器,只有加减法,之前数据结构学习栈的时候,提到了可以直接用两个栈解决。这学期学习编译原理课,也学到了栈式计算机,也是提供简单的栈指令可以实现计算器。
这里状态不多,不需要使用switch语句,构建DFA。直接使用if else即可。这里一共就4种类型的符号。操作符,数字,括号,括回。
这里使用一个sign符号代表当前的操作符。
碰到数字,将当前保存的数字乘10,加上这次数字 碰到操作符,因为这里没有优先级,可以直接计算上一个操作的结果,然后将sign改为这次操作对应操作符 碰到括号,将当前结果和操作符保存。括号就相当于一次递归调用函数,括号里面就是一次计算,需要保存之前的结果。 碰到括回,弹出上次保存的结果,将其与括号里的相加。
code
class Solution {
public:
int calculate(string s) {
stack<int> number,ops;
int res=0,num=0,sign=1;
for(auto&ch:s){
if(ch==' ')
continue;
if(ch<='9'&&ch>='0'){
num = num*10 + static_cast<int>(ch-'0');
}else{
res+=sign*num;
num=0;
if(ch=='+')
sign=1;
else if(ch=='-')
sign=-1;
if(ch=='('){
number.push(res);
res=0;
ops.push(sign);
sign=1;
}else if(ch==')'){
res=res*ops.top()+number.top();
number.pop();ops.pop();
}
}
}
res+=sign*num;
return res;
}
};
algorithm analysis
只需要一次遍历字符串,时间复杂度O(n),使用栈保存结果,最坏情况下空间复杂度O(n)
Last updated