实现一个基本的计算器来计算一个简单的字符串表达式
s
的值。
先附上一个大佬的做法,两个栈一个记录数字,一个记录左括号前面的符号F,这样当遇到右括号的时候直接将栈顶的值加上F*括号内的值,很简便的做法
class Solution {
public int calculate(String s) {
int ans=0;
char[] str=s.toCharArray();
int len=str.length;
Stack<Integer> st_num=new Stack<>();
Stack<Integer> st_signs=new Stack<>();
int sign=1;//正负号,运算符号
for(int i=0;i<len;i++){
if(str[i]==' ') continue;
if(str[i]=='+'||str[i]=='-') sign=str[i]=='+'? 1:-1;
else if(str[i]>='0'&&str[i]<='9'){//数字
int num=str[i]-'0';
while(i<len-1&&str[i+1]>='0'&&str[i+1]<='9'){//将这个数字找完
num=num*10+(str[++i]-'0');
}
ans+=sign*num;
}else if(str[i]=='('){//左括号,暂存结果
st_num.push(ans);
st_signs.push(sign);
ans=0;
sign=1;
}
else ans=st_num.pop()+ans*st_signs.pop();//右括号更新结果
}
return ans;
}
}
作者:CYINGENOHALT
链接:https://leetcode-cn.com/problems/basic-calculator/solution/shuang-zhan-shuang-90-by-cyingenohalt-eoy3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1 <= s.length <= 3 * 105
s
由数字、'+'
、'-'
、'('
、')'
、和' '
组成s
表示一个有效的表达式
这道题wa了很多次,还有很多点没有想到,导致代码改的很乱。
主要的几个测试点有
-(2+1)
-(-2+1)
(1-(6-7)+2)
12+15
我基本上就是对几个方法特判或者特殊处理下。
主要思路先把空格去了,然后用两个栈来维护算式情况,当遇到右括号两个栈都应该退栈到左括号并计算括号里面的
然后模拟就好了
class Solution {
public:
int calculate(string s) {
int len = s.size();
string str = "";
for(int i =0 ;i<len;i++){
if(s[i]!=' ') str+=s[i];
}
s = str;
len = str.size();
stack<long long> sta_int;
stack<char> sta_char;
int ffff = 1;
int flag = 0;
int fz = 1,i = 0;
if(len>2&&s[0]=='-'&&s[1]=='('){
ffff =-1;
i = 1;
}
for(;i < len; i++){
if(s[i]>='0'&&s[i]<='9'){
long long temp = 0;
int j = i;
for(;j<len;j++){
if(!(s[j]>='0'&&s[j]<='9')){
break;
}
temp = temp * 10 + s[j] - '0';
}
if(sta_int.size()==0)
sta_int.push(temp*fz);
else sta_int.push(temp);
if(j==len) break;
else i = j - 1;
}else{
if(s[i]=='+'&&sta_int.size()==0){
continue;
}
if(s[i]=='-'&&sta_int.size()==0){
fz = -1;
continue;
}
if(s[i]==')'){
while(sta_char.top()!='('){
char fuhao = sta_char.top();
int num = sta_int.top();
sta_char.pop();
sta_int.pop();
int sign = 1;
if(sta_char.size()){
sign = sta_char.top()=='-'?-1:1;
if(sta_char.top()!='(')sta_char.top() = '+';
}
if(fuhao=='+') sta_int.top() = sign * sta_int.top() + num;
if(fuhao=='-') sta_int.top() = sign * sta_int.top() - num;
}
sta_char.pop();
}
else sta_char.push(s[i]);
}
}
while(sta_char.size()){
char fuhao = sta_char.top();
int num = sta_int.top();
sta_char.pop();
sta_int.pop();
int sign = 1;
if(sta_char.size()){
sign = sta_char.top()=='-'?-1:1;
if(sta_char.top()!='(')sta_char.top() = '+';
}
if(fuhao=='+') sta_int.top() = sign * sta_int.top() + num;
if(fuhao=='-') sta_int.top() = sign * sta_int.top() - num;
}
return sta_int.top()*ffff;
}
};
数值。