LeetCode-150- 逆波蘭表示式求值

雄獅虎豹發表於2022-01-30

逆波蘭表示式求值

題目描述:根據 逆波蘭表示法,求表示式的值。

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

說明:

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

逆波蘭表示式:詳情介紹見逆波蘭表示式

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:棧

利用棧後進先出的特點來求解逆波蘭表示式(字尾表示式)的值,具體求解過程如下:

  • 如果原表示式只有一個引數,則直接返回運算元。
  • 否則,宣告一個運算元棧nums用來存放運算元,按順序遍歷逆波蘭表示式的字元:

    • 如果當前字元是運算元,則直接入棧;
    • 如果當前字元是操作符,則從棧中取出2個運算元,並按照當前操作符進行計算,將計算結果重新計算。
  • 最後,返回運算元棧的唯一的一個值,即為逆波蘭表示式的求值結果。
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class LeetCode_150 {

    public static int evalRPN(String[] tokens) {
        if (tokens.length == 1) {
            return Integer.valueOf(tokens[0]);
        }
        List<String> operatorList = new ArrayList<>();
        operatorList.add("+");
        operatorList.add("-");
        operatorList.add("*");
        operatorList.add("/");

        // 運算元棧
        Stack<Integer> nums = new Stack<>();

        for (int i = 0; i < tokens.length; i++) {
            if (operatorList.contains(tokens[i])) {
                // 如果是操作符,取出2個運算元進行運算然後將結果重新入棧
                int num1 = Integer.valueOf(nums.pop());
                int num2 = Integer.valueOf(nums.pop());
                if ("+".equals(tokens[i])) {
                    nums.push(num2 + num1);
                } else if ("-".equals(tokens[i])) {
                    nums.push(num2 - num1);
                } else if ("*".equals(tokens[i])) {
                    nums.push(num2 * num1);
                } else if ("/".equals(tokens[i])) {
                    nums.push(num2 / num1);
                }
            } else {
                // 如果是運算元,則入棧
                nums.push(Integer.valueOf(tokens[i]));
            }
        }
        return nums.pop();
    }

    public static void main(String[] args) {
        // 測試用例
        String[] tokens = new String[]{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"};
        // 轉換成中綴表示式的結果是: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
        // 計算結果為: 22
        System.out.println(evalRPN(tokens));
    }
}
【每日寄語】 世上無難事,只要肯登攀。

相關文章