diff --git a/lab1 b/lab1 new file mode 100644 index 0000000000000000000000000000000000000000..33f980a0ccf0fafd25606aa1dff9a5a3d872da1c --- /dev/null +++ b/lab1 @@ -0,0 +1,50 @@ +def evaluate_expression(expr): + def apply_op(op, vals): + r, l = vals.pop(), vals.pop() + if op == '+': vals.append(l + r) + elif op == '-': vals.append(l - r) + elif op == '*': vals.append(l * r) + elif op == '/': vals.append(l / r) + def op_precedence(op1, op2): + precedences = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0, ')': 0} + return precedences[op1] >= precedences[op2] + operators, values, i = [], [], 0 + while i < len(expr): + if expr[i] == ' ': + i += 1 + continue + if expr[i] in '0123456789': + j = i + while j < len(expr) and expr[j] in '0123456789': + j += 1 + values.append(int(expr[i:j])) + i = j + elif expr[i] == '(': + operators.append(expr[i]) + i += 1 + elif expr[i] == ')': + while operators[-1] != '(': + apply_op(operators.pop(), values) + operators.pop() + i += 1 + else: + while operators and operators[-1] != '(' and op_precedence(operators[-1], expr[i]): + apply_op(operators.pop(), values) + operators.append(expr[i]) + i += 1 + + while operators: + apply_op(operators.pop(), values) + return values[0] + +def main(): + N = int(input().strip()) + for _ in range(N): + expr = input().strip().replace(" ", "") + try: + print(evaluate_expression(expr)) + except: + print("ERROR") + +if __name__ == "__main__": + main()