LeedCode 150 逆波蘭表達式求值 c++ 《接解題分析加實現代碼》

和前面的一樣,我們先看下題目的要求:

根據逆波蘭表示法,求表達式的值。

有效的運算符包括 +, -, *, / 。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。

說明:

整數除法只保留整數部分。
給定逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數爲 0 的情況。
示例 1:

輸入: ["2", "1", "+", "3", "*"]
輸出: 9
解釋: ((2 + 1) * 3) = 9
示例 2:

輸入: ["4", "13", "5", "/", "+"]
輸出: 6
解釋: (4 + (13 / 5)) = 6
示例 3:

輸入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
輸出: 22
解釋: 
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

通過題目的要求:我們可以理解題目的要求,但是該有什麼樣的思路解決這一道問題呢?有什麼思路嗎?

我們使用的是:《 中綴轉後綴》

我們來分析一下:
首先是:我們要知道,題目的優先級順序,‘+’,‘ - ’ 爲一個優先級,‘*’,‘ / ’爲一個優先級;
第二部:我們應該怎麼樣實現一個判斷優先級,那麼現在我們就用一個棧,來實現,遇到第一個數,先入棧,然後,繼續往下面走,遇到第一操作符,先入棧,遇到第一個操作符,先入棧,然後查看第二給值 ,繼續放棧裏面,然後繼續操作符,判斷與第一個操作符的優先級關係,是否優先,計算,然後入棧,和上面的重複就行了。

在這裏插入圖片描述
畫的不太好,嘿嘿,大概理解一下;
第三步;
大多的時候,不僅僅是加減乘除,還有括號,那麼,括號的優先級怎麼樣?
這裏說明一下,括號的優先級比較低,遇到括號,不用管,直接繼續計算。

下面,我們看一下實現的代碼:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        //首先先遍歷一遍:
        for(const auto& str : tokens)
        {
            if(str == "+" || str == "-" || str == "*" || str == "/")
            {
                int right = st.top();
                st.pop();
                int left = st.top();
                st.pop();
                switch(str[0])
                {
                    case '+':
                          st.push(left + right);
                        break;
                    case '-':
                          st.push(left - right);
                        break;
                    case '*':
                        st.push(left * right);
                        break;
                    case '/':
                        st.push(left / right);
                        break;
                }
            }
            else
            {
                st.push(atoi(str.c_str()));        //把字符串轉成整形;
            }
        }
             return st.top();
    }
};

這段程序我也有了一點的補充,所以理解是沒有問題了,那麼可以自己實現以下了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章