逆波蘭表示式求值——棧與佇列

小橘0815發表於2024-11-18

首先是第一次的程式碼

class Solution
{
public:
    int evalRPN(vector<string> &tokens)
    {
        stack<long long> str;
        for (int i = 0; i < tokens.size(); i++)
        {
            if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")
            {
                // 用於將字串轉換為 long long 型別的整數。
                str.push(stoll(tokens[i]));
            }
            else
            {
                // 沒有辦法直接把表達符放中間就一個一個if
                long long num1 = str.top();
                str.pop();
                long long num2 = str.top();
                str.pop();
                if (tokens[i] == "+")
                    str.push(num1 + num2);
                if (tokens[i] == "*")
                    str.push(num1 * num2);
                if (tokens[i] == "-")
                    str.push(num2 - num1);
                if (tokens[i] == "/")
                    str.push(num2 / num1);
            }
        }
        int sum = str.top();
        return sum;
    }
};

然後是第二次的程式碼

問題一在於 我該如何再不確定運算子的情況下進行計算——————就是一個一個if

問題二在於注意string和char的區別一個是雙引號一個是單引號

問題三在於型別的對應問題 “no matching member function for call to 'push'” 這就是說明把string的型別傳入了int 中需要進行型別的轉換,又考慮到只有數字進去了所以只對數字進行轉換即可。

但是stoll 是 C++ 中用於將字串轉換為 long long 型別整數的函式,所以這就意味著棧也必須是long long型別的

第二版程式碼邏輯正確但是有兩個很細節的問題

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> s1; // 存放輸入
        int size = tokens.size();
        for (int i = 0; i < size; i++) {
            if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" &&
                tokens[i] != "/") {
                s1.push(stoll(tokens[i]));
            } else {
                if (tokens[i] == "+") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a + b; // 我該如何再不確定運算子的情況下進行計算
                    s1.push(c);
                    continue;
                } else if (tokens[i] == "-") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a - b;
                    s1.push(c);
                    continue;
                } else if (tokens[i] == "*") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a * b;
                    s1.push(c);
                    continue;
                } else if (tokens[i] == "/") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a / b;
                    s1.push(c);
                    continue;
                }
            }
        }
        int result = s1.top();
        return result;
    }
};

細節一:外面都是long long型別 那麼裡面也應該是一樣的,所以都需要改成了long long‘

細節二:就是運算順序的問題,先出來的那個應該是在運算子的右邊、

然後經過實驗也不是說一定要轉成long long 型別我們直接使用stoi把他們都轉成int型別的也可以。

儲存範圍:

  • int:通常是 4 位元組(32 位),它的取值範圍是:
    • 有符號(signed)int-2^312^31 - 1,即大約 -21億21億
    • 無符號(unsigned)int02^32 - 1,即大約 042億
  • long long:通常是 8 位元組(64 位),它的取值範圍是:
    • 有符號(signed)long long-2^632^63 - 1,即大約 -9.2 x 10^189.2 x 10^18
    • 無符號(unsigned)long long02^64 - 1,即大約 018.4 x 10^18

相關文章