LeetCode 150:逆ポーランド式の評価は、逆ポーランド記法を評価します

トピック:

よると、逆ポーランド記法、式を評価します。

効果的な事業者は含まれ+-*/各オペランドは整数であることができ、それは別の逆ポーランド記法であることができます。

算術式の値が評価逆ポーランド記法を

有効な演算子は+-*/各オペランドは整数または別の表現であってもよいです。

説明:

  • のみ整数部整数除算を残します。
  • 常に効果的な逆ポーランド記法を考えます。換言すれば、効果的な数式が常に得られ、何ら除数がゼロではありません。

注意:

  • 二つの整数間の部門はゼロに向かって切り捨てる必要があります。
  • 与えられたRPN式は常に有効です。これは、式は常に結果を評価するだろうし、ゼロ操作によって任意の格差がないことを意味します。

例1:

输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9

例2:

输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6

例3:

输入: ["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

拡張:

ポーランド記法リバース、その文法の提供を、式は逆ポーランド記法に道を譲る必要があります。ポーランド記法とも呼ばれる後置記法を逆にします。これらの2つのコースでは、このデータ構造における知識とコンパイラの理論が導入され、以下のいくつかの例を示します。

a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a,1,3,+,=

上記の例から分かるように。

(1)オペランドと同じ順序で表さ両方に現れます。

(2)サフィックスに、各オペレータは常に左から右へ、から実際の計算順序に応じて、オペレータは、そのオペランドの後に続きます。

この式は、人類に対してですが、コンピュータの操作がスタックデータ構造を使用することがあるので、あなたのコンピュータに非常に友好的。

問題解決のアイデア:

オペレータ前に、2つの数値間の動作の各々に属する逆ポーランド記法オペレータに見ることができます。以下のような:

如波兰表达式:1,2,+
则加号前两个数字为1,2。其运算符就是加号:1+2
得出结果:1+2=3

如波兰表达式:1,2,3,+,-
则加号前两个数字为2,3。其运算符就是加号:2+3
得出结果2+3=5,则波兰表达式变为:1,5,-
减号前两个数字为1,5,其运算符就是减号:1-5
得出结果1-5=-4

上記考え方の例は非常にはっきりしている、直接ポインタトラバーサル発現、スタック上の数字は、オペレータがポップ二つの数字、その操作後の結果、別々の番号として、スタックが発生します。演算式の結果だけで、スタック内の最後の要素。また、再帰的に使用することができます

Javaの:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (String t : tokens) {
            if (t.equals("+")) {
                stack.push(stack.pop() + stack.pop());
            } else if (t.equals("-")) {
                int tmp = stack.pop();
                stack.push(stack.pop() - tmp);
            } else if (t.equals("*")) {
                int tmp = stack.pop();
                stack.push(stack.pop() * tmp);
            } else if (t.equals("/")) {
                int tmp = stack.pop();
                stack.push(stack.pop() / tmp);
            } else {
                stack.push(Integer.parseInt(t));
            }
        }
        return stack.pop();
    }
}

Pythonの:

Pythonは、上記の方法この質問に答えるために、スタック配列の代わりに使用することができます。ここでは、代わりに4つの判断の場合は、別の関数eval():

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for t in tokens:
            if t in '+-*/':
                tmp = stack.pop()
                stack.append(int(eval('stack.pop()' + t + 'tmp')))
            else:
                stack.append(int(t))
        return stack.pop()

evalの()関数は、声明の中で渡された文字列パラメータを行うことができます。

eval('print("hhhhh")')実行パラメータ文字列HHHHHを出力します

懸念マイクロチャンネル公衆番号へようこそ:愛のバグを書きます
ここに画像を挿入説明

おすすめ

転載: www.cnblogs.com/zhangzhe532/p/11303284.html