(LC)150。逆ポーランド表現評価

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));
    }

おすすめ

転載: blog.csdn.net/weixin_45567738/article/details/115025858