【leetcode】:Evaluate Reverse Polish Notation (python)
逆ポーランド式の解を求めて、1つのクラスのスタックの容器を創立して、与えられた逆ポーランドの表現式を遍歴して、数字に出会ってpushになって、オペレータに出会ってスタックを出して、連続して2回出て、与えられた4つの演算子はすべて両目なので、ここでこの2つの操作数の前後の順序に注意して、加算と乗算に対して関係がないため、しかし減算と除算には前後関係がある.その後、対応する演算を行い、結果pushをスタックに入力します.
ここではpythonで行う除算演算がc,javaシリーズでの除算と異なることを説明し,下向きに整頓する問題である.この違いは,2つのオペランドシンボルが異なる場合に現れる.
cでは3/-5=0ですが、pythonでは-1になります.この違いは何が原因ですか?あるいはpythonはなぜこのような調整をしたのでしょうか.
この表現形式を抽象化すると,a/b=q,残数はrである.
a = ( b * q ) + r
しかし、上記の例では、cの結果は(0*(-5)+(-2)=-2が-5に等しくないが、pythonでは(-1*(-5)+(-2)=5-2=3であることが分かった.
つまりpythonの処理は数学の美しさに合っているということです(一応そうしましょう)
ここではpythonで行う除算演算がc,javaシリーズでの除算と異なることを説明し,下向きに整頓する問題である.この違いは,2つのオペランドシンボルが異なる場合に現れる.
cでは3/-5=0ですが、pythonでは-1になります.この違いは何が原因ですか?あるいはpythonはなぜこのような調整をしたのでしょうか.
この表現形式を抽象化すると,a/b=q,残数はrである.
a = ( b * q ) + r
しかし、上記の例では、cの結果は(0*(-5)+(-2)=-2が-5に等しくないが、pythonでは(-1*(-5)+(-2)=5-2=3であることが分かった.
つまりpythonの処理は数学の美しさに合っているということです(一応そうしましょう)
class Solution:
def isOp(self, s):
return s == "+" or \
s == "-" or \
s == "*" or \
s == "/"
def add( self, op1, op2 ):
return op1 + op2
def sub( self, op1, op2 ):
return op1 - op2
def mul( self, op1, op2 ):
return op1 * op2
def div( self, op1, op2 ):
if op1 * op2 < 0:
return -((-op1) / op2 )
return op1 / op2
#mapping from op to func
operator = { "+": add, "-": sub, "*": mul, "/": div }
def evalRPN( self, tokens ):
nums = []
for s in tokens:
if self.isOp( s ):
op2 = nums.pop()
op1 = nums.pop()
re = self.operator.get( s )(self, op1, op2 )
nums.append( re )
else:
nums.append( int( s ) )
return nums[ 0 ]