「程式碼隨想錄演算法訓練營」第十天 | 棧與佇列 part2

云雀AC了一整天發表於2024-07-13

150. 逆波蘭表示式求值

題目連結:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
題目難度:中等
文章講解:https://programmercarl.com/0150.逆波蘭表示式求值.html
影片講解:https://www.bilibili.com/video/BV1kd4y1o7on
題目狀態:多次修改 bug 後透過

個人思路:

透過進行解決。
先判斷佇列中的元素是否為數字型別。若為數字型別,壓入棧;若不是數字型別,則肯定是運算子,使用switch結構進行運算,將棧中的頭兩個元素彈出,進行運算子運算,運算後將結果在壓入棧中。最後返回棧頂元素。

修改 bug 的過程

  1. 棧的空間:當棧內有兩個或兩個以上的元素的時候才能進行運算子運算。
  2. 符號判斷:在判斷佇列元素是否為數字的時候,忘記還有負數這一項,需要先判斷元素的第一個元素是否為-且元素是否含有多個元素,若是,則從元素中的下一個元素判斷是否為數字;若不是,則直接判斷。

程式碼實現:

class Solution {
public:
    bool isNum(const string &s) {
        if(s[0] == '-' && s.size() > 1) {
            for(int i = 1; i < s.size(); ++i) {
                if(!isdigit(s[i])) return false;
            }
        } else if(s[0] == '-' && s.size() == 1) {
            return false;
        } else {
            for(auto &elem: s) {
                if(!isdigit(elem)) return false;
            }
        }
        return !s.empty();
    }

    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(auto &token: tokens) {
            if(isNum(token)) {
                st.push(stoi(token));
            }
            else if(!st.empty() && st.size() >= 2){
                int op1 = st.top(); st.pop();
                int op2 = st.top(); st.pop();
                int res = 0;
                switch(token[0]) {
                    case '+': res = op2 + op1; break;
                    case '-': res = op2 - op1; break;
                    case '*': res = op2 * op1; break;
                    case '/': res = op2 / op1; break;
                }
                st.push(res);
            }
        }
        return st.top();
    }
};

相關文章