leetcode 224 基本計算器

oxidationreaction發表於2024-07-21

題面就是實現一個字串輸入的加減法計算器(帶括號),注意一元的減號是會出現的,且字串中有空格
思路就是使用兩個棧,一個儲存數字和計算結果,另外一個存運算子。
基本步驟

  • 刪去括號
  • 如果遇到')'就開始計算直到前一個左括號,運算順序是先出棧的放在後面

遇到的坑

  • 減號的優先順序是高的,所以遇到減號要直接計算
  • 在將字串轉化成數字時要先算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();
    }
};

相關文章