逆ポーランド電卓ってまだあるんだな。アマゾンでも売ってる。
というわけでちょっと作ってみた。
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