逆波蘭表示式求值
題目描述:根據 逆波蘭表示法,求表示式的值。
有效的算符包括 +、-、*、/ 。每個運算物件可以是整數,也可以是另一個逆波蘭表示式。
說明:
- 整數除法只保留整數部分。
- 給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 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));
}
}
【每日寄語】 世上無難事,只要肯登攀。