LeetCode Evaluate Reverse Polish Notation


LeetCode解題のEvaluate Reverse Polish Notation
原題
式の接尾辞形式(逆ポーランド式とも呼ばれる)を計算し、結果を返します.オペレータは4種類の加算減算のみで、オペランドは整数または式です.
注意点:
  • なし
    例:
    入力:tokens=["2","1","+","3","*"]
    出力:9
    問題を解く構想.
    接尾辞式の形式は 1, 2, で、つまりオペレータが計算操作を行う2つの数(または式)がその前にあるので、リストを巡るときに前のオペレータをスタックに押し込み、オペレータに遭遇したときに対応するオペレータをポップアップして計算し、計算結果は他のオペレータの操作数である可能性があります.元は式で、私たちは式の値を計算したので、その値をスタックに押し続け、リスト全体を巡ると計算が終わります.ここで特に注意しなければならないのは除法操作であり,与えられた式はすべて合法的であるため,除数がゼロの場合を考慮する必要はないが,ここでの除法操作は整数に対して行われ,結果をテールオフ操作する.負数と整数の除算操作もPythonが持つ計算方式とは異なり、Python計算-1//2の結果は-1であり、ここでは0であるべきであるため、特殊な処理を行う.
    ACソース
    class Solution(object):
        def evalRPN(self, tokens):
            """ :type tokens: List[str] :rtype: int """
            stack = []
            for token in tokens:
                if token not in ("+", "-", "*", "/"):
                    stack.append(int(token))
                else:
                    second = stack.pop()
                    first = stack.pop()
                    if token == "+":
                        stack.append(first + second)
                    elif token == "-":
                        stack.append(first - second)
                    elif token == '*':
                        stack.append(first * second)
                    else:
                        if first * second < 0:
                            stack.append(-(abs(first) // abs(second)))
                        else:
                            stack.append(first // second)
            return stack.pop()
    
    
    if __name__ == "__main__":
        assert Solution().evalRPN(["2", "1", "+", "3", "*"]) == 9
        assert Solution().evalRPN(["4", "13", "5", "/", "+"]) == 6
        assert Solution().evalRPN(["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]) == 22

    私のGithub(https://github.com/gavinfish/LeetCode-Python)を使用して、関連するソースコードを取得します.