Python

Решить задачу без метода "eval" на пайтоне

Дана строка, содержащая одно или более целых чисел от 0 до 109, разделенных знаками “+” или “-”. Вычислите значение этого выражения.
 print(sum(map(int, input().replace(' ', '').replace('+', ' +').replace('-', ' -').split()))) 
Убираем из строки пробелы, ставим пробел перед каждым плюсом и минусом, разрезаем строку по пробелам, преобразуем строки в числа, суммируем.
Анатолий Шерстнев
Анатолий Шерстнев
76 267
Лучший ответ
Без eval
 exec(f"print({input()})") 
Евгений Шумков
Евгений Шумков
34 940
Для решения данной задачи можно использовать алгоритм стека. Мы будем использовать два стека: один для чисел и один для операторов.
Разбейте строку на подстроки, разделенные знаками “+” или “-”.
Проходите по каждой подстроке и добавляйте числа в стек чисел.
Если следующий знак в выражении “+”, добавьте его в стек операторов. Если следующий знак “-”, поменяйте его на противоположный (т.е. “+”) и добавьте в стек операторов.
Если следующая подстрока не содержит чисел (т.е. это оператор), добавьте ее в стек операторов.
Пройдите по стеку операторов, вытаскивая операторы по одному и применяя их к двум верхним числам в стеке чисел. Результат поместите обратно в стек чисел.
В конце работы алгоритма в стеке чисел останется одно число – значение выражения.
 def evaluate_expression(expression): 
num_stack = []
op_stack = []
i = 0

while i < len(expression):
if expression[i].isdigit():
j = i
while j < len(expression) and expression[j].isdigit():
j += 1
num_stack.append(int(expression[i:j]))
i = j
elif expression[i] in "+-":
op_stack.append(expression[i])
i += 1
else:
i += 1

while op_stack:
op = op_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
if op == "+":
num_stack.append(num1 + num2)
else:
num_stack.append(num1 - num2)

return num_stack[0]
 Вы можете вызвать эту функцию, передав строку в качестве аргумента: 

expression = "1+2-3+4-5"
result = evaluate_expression(expression)
print(result) # Выведет: -1
СШ
Сергей Шошин
13 649
Сергей Шошин
 def evaluate_expression(expression):  
num_stack = []
op_stack = []

for i in range(len(expression)):
if expression[i].isdigit():
j = i
while j < len(expression) and expression[j].isdigit():
j += 1
num_stack.append(int(expression[i:j]))
i = j - 1
elif expression[i] in "+-":
op_stack.append(expression[i])

while op_stack:
op = op_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
if op == "+":
num_stack.append(num1 + num2)
else:
num_stack.append(num1 - num2)

return num_stack[0]
В качестве троллинга учителя можно использовать метод "exec", если грубо он делает тоже самое что и "eval".
Денис Михеев
Денис Михеев
11 032
Хз как делать, но знаю что через импорт рандом.
Jandaulet Shakarov
Jandaulet Shakarov
178