コード例 #1
0
ファイル: Calculator.py プロジェクト: robrogers3/python-tests
class Calculator():
    def __init__(self):
        self.operators = Stack()
        self.operands = Stack()
        self.operatorsMap = {'/': 2, '*': 2, '-': 1, '+': 1, '(': 0, ')': 0}

    def evaluate(self, expression):
        if expression is None or len(expression) == 0:
            return 0

        expression = expression.split(' ')

        for ch in expression:
            if self.isOperand(ch):
                self.operands.push(int(ch))
            elif ch == '(':
                self.operators.push(ch)
            elif ch == ')':
                while self.operators.peek() != '(':
                    self.process()

                self.operators.pop()

            elif self.isOperator(ch):
                while not self.operators.empty() and self.precedence(
                        self.operators.peek()) >= self.precedence(ch):
                    self.process()

                self.operators.push(ch)

        while not self.operators.empty():
            self.process()

        return self.operands.pop()

    def process(self):
        map = {'+': self.add, '-': self.sub, '*': self.multi, '/': self.divide}
        right = self.operands.pop()
        left = self.operands.pop()
        operator = self.operators.pop()
        func = map[operator]
        r = func(left, right)
        self.operands.push(r)

    def isOperand(self, char):
        return re.match(r'^\d+$', char) is not None

    def isOperator(self, char):
        return char in self.operatorsMap

    def precedence(self, operator):
        if operator not in self.operatorsMap:
            raise Exception(f"unknown operateor {operator}")

        return self.operatorsMap[operator]

    def add(self, left, right):
        return left + right

    def sub(self, left, right):
        return left - right

    def divide(self, left, right):
        return left / right

    def multi(self, left, right):
        return left * right