LeetCode Evaluate Reverse Polish Notation
LeetCode解題のEvaluate Reverse Polish Notation
原題
式の接尾辞形式(逆ポーランド式とも呼ばれる)を計算し、結果を返します.オペレータは4種類の加算減算のみで、オペランドは整数または式です.
注意点: なし
例:
入力:tokens=["2","1","+","3","*"]
出力:9
問題を解く構想.
接尾辞式の形式は
ACソース
私のGithub(https://github.com/gavinfish/LeetCode-Python)を使用して、関連するソースコードを取得します.
原題
式の接尾辞形式(逆ポーランド式とも呼ばれる)を計算し、結果を返します.オペレータは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)を使用して、関連するソースコードを取得します.