150.逆ポーランド式の評価
逆ポーランド記法に従って、式の値を見つけます。
有効な演算子には、+、-、*、/が含まれます。各オペランドは、整数または別の逆ポーランド式にすることができます。
説明:
整数除算は整数部分のみを保持します。
指定された逆ポーランド式は常に有効です。つまり、式は常に有効な値を生成し、除数がゼロになることはありません。
例1:
入力:tokens = ["2"、 "1"、 "+"、 "3"、 "*"]
出力:9
説明:この式は、一般的な中置算術式に変換されます:((2 + 1)* 3) = 9
例2:
入力:tokens = ["4"、 "13"、 "5"、 "/"、 "+"]
出力:6
説明:この式は、一般的な中置算術式に変換されます:(4 +(13/5)) = 6
例3:
入力:tokens = ["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
促す:
1 <= tokens.length <= 104
tokens [i]は、演算子( "+"、 "-"、 "*"、または "/")または[-200、200]の範囲の整数です。
逆ポーランド表現:
逆ポーランド式は一種の後置式です。いわゆる後置は、演算子が後ろに書かれていることを意味します。
一般的に使用される式は、(1 + 2)*(3 + 4)などの中置式です。
この式の逆ポーランド式は、((1 2 +)(3 4 +)*)と記述されます。
逆ポーランド語式には、主に次の2つの利点があります。
かっこを削除すると、式が明確になります。上記の式を1 2 + 3 4 + *と記述しても、順序に従って正しい結果を計算できます。
スタック操作の操作に適しています。数値に遭遇するとスタックにプッシュされます。演算子に遭遇すると、スタックの一番上の2つの数値が計算のために取り出され、結果がスタックにプッシュされます。
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList<Integer>();
int num = tokens.length;
for (int i=0; i<num; i++) {
String token = tokens[i];
if (isNumber(token)) {
stack.push(Integer.parseInt(token)); // 字符串转int
} else {
int num2 = stack.pop();
int num1 = stack.pop();
switch (token) {
case "+" : stack.push(num1+num2); break;
case "-" : stack.push(num1-num2); break;
case "*" : stack.push(num1*num2); break;
case "/" : stack.push(num1/num2); break;
default:
}
}
}
return stack.pop();
}
// 判断 从栈中取出的是+-*/ 还是数字
public boolean isNumber(String token) {
return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
}