Cod sursa(job #2559135)

Utilizator gabrielbGabriel baraboi gabrielb Data 27 februarie 2020 03:47:45
Problema Evaluarea unei expresii Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 2.49 kb
class Stack(object):
    def __init__(self):
        self.items = []

    def __str__(self):
        return "{}".format(self.items)

    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items) - 2]

    def new(self):
        return self.items[len(self.items) - 1]

    def size(self):
        return len(self.items)


def priority(operator):
    if operator == '+' or operator == '-':
        return 1
    if operator == '*' or operator == '/':
        return 2
    return 0


def calculate(a, b, operator):
    if operator == '+': return a + b
    if operator == '-': return a - b
    if operator == '*': return a * b
    if operator == '/': return a // b


def evaluate(expression):
    i = 0

    while i < len(expression):
        if expression[i] == ' ':
            i += 1
            continue
        elif expression[i] == '(':
            operatorsStack.push(expression[i])
        elif expression[i].isdigit():
            operand = 0
            while (i < len(expression) and
                   expression[i].isdigit()):
                operand = (operand * 10) + int(expression[i])
                i += 1
            operandsStack.push(operand)
        elif expression[i] == ')':
            while operatorsStack.size() != 0 and operatorsStack.new() != '(':
                operand2 = operandsStack.pop()
                operand1 = operandsStack.pop()
                operator = operatorsStack.pop()
                operandsStack.push(calculate(operand1, operand2, operator))
            operatorsStack.pop()
        else:
            while (operatorsStack.size() != 0 and
                   priority(operatorsStack.new()) >= priority(expression[i])):
                operand2 = operandsStack.pop()
                operand1 = operandsStack.pop()
                operator = operatorsStack.pop()

                operandsStack.push(calculate(operand1, operand2, operator))

            operatorsStack.push(expression[i])

        i += 1
    while operatorsStack.size() != 0:
        operand2 = operandsStack.pop()
        operand1 = operandsStack.pop()
        operator = operatorsStack.pop()

        operandsStack.push(calculate(operand1, operand2, operator))
    return operandsStack.new()


s = ''
operatorsStack = Stack()
operandsStack = Stack()
print(s, '=', evaluate(s))