逆ポーランド電卓ってまだあるんだな。アマゾンでも売ってる。
というわけでちょっと作ってみた。
import sys
class InvalidToken(Exception):
pass
class RPNCalc:
def __init__(self):
self.stack = []
def calc(self, expr):
try:
tokens = expr
if not tokens[-1] in '+-*/':
raise InvalidToken
for token in tokens:
if token.isdigit():
self.stack.append(int(token))
elif token == '+':
a = self.stack.pop()
b = self.stack.pop()
self.stack.append(b + a)
elif token == '-':
a = self.stack.pop()
b = self.stack.pop()
self.stack.append(b - a)
elif token == '*':
a = self.stack.pop()
b = self.stack.pop()
self.stack.append(b * a)
elif token == '/':
a = self.stack.pop()
b = self.stack.pop()
self.stack.append(b / a)
else:
raise InvalidToken
except:
print 'Invalid expression'
exit()
return self.stack.pop()
calculator = RPNCalc()
expr = sys.argv[1:]
print calculator.calc(expr)
^o^ > rpncalc.py 6 2 + 5 3 - 2 * / 2
やっつけの手抜きなので、正しく入力しないとエラーにならずに間違った答えを返す。そのうち気が向いたら直すかも。
^o^ > rpncalc.py 1 2 3 + 5