【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の処理は数学の美しさに合っているということです(一応そうしましょう)
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 ]