題面就是實現一個字串輸入的加減法計算器(帶括號),注意一元的減號是會出現的,且字串中有空格
思路就是使用兩個棧,一個儲存數字和計算結果,另外一個存運算子。
基本步驟
- 刪去括號
- 如果遇到')'就開始計算直到前一個左括號,運算順序是先出棧的放在後面
遇到的坑
- 減號的優先順序是高的,所以遇到減號要直接計算
- 在將字串轉化成數字時要先算
s[i]-'0'
,否則可能會超出int範圍 - 最簡單的處理方法就是在每個新操作前把能算的都算完
tips
為了處理方便,可以在一元'+' 和'-'前面push(0)
具體程式碼
class Solution {
public:
void cal(stack<int>& numbers, stack<char>& operators){
if(numbers.size()<2||operators.empty()) return;
int num1, num2;
char op;
op=operators.top();
operators.pop();
num2=numbers.top();
numbers.pop();
num1=numbers.top();
numbers.pop();
if(op=='+'){numbers.push(num1+num2);}
else if(op=='-'){numbers.push(num1-num2);}
}
void replace_space(string& s){
int pos=s.find(" ");
while(pos!=-1){
s.replace(pos,1,"");
pos=s.find(" ");
}
}
int calculate(string s) {
stack<int> numbers;
stack<char> operators;
if(s[0]=='-'||s[0]=='+') numbers.push(0);
int num = 0;
replace_space(s);
for (int i = 0; i < s.length();i++) {
if (s[i] >= '0' && s[i] <= '9') {
int number=0;
int j=i;
while(j<s.length()&&s[j]>='0'&&s[j]<='9'){
number=number*10+s[j]-'0';
j++;
}
numbers.push(number);
i=j-1;
}
else if(s[i]==')'){
while(!operators.empty()){
char op=operators.top();
if(op!='(')
cal(numbers,operators);
else{
operators.pop();
break;
}
}
}
else if(s[i]=='(') operators.push(s[i]);
else{
if(i>0&&(s[i-1]=='('||s[i-1]=='+'||s[i-1]=='-')) numbers.push(0);
while (!operators.empty()&&operators.top()!='(')
{
cal(numbers,operators);
}
operators.push(s[i]);
}
}
while(!operators.empty()){
cal(numbers,operators);
}
return numbers.top();
}
};