followup code

Hi Roger, it happens there is a more native way to evaluate string expression in python eval(). Catch is that for safety reasons, using eval() on raw user input is not good practice. So added an input check to raise an exception.
 avatar
user_9809957
python
2 years ago
1.8 kB
12
Indexable
def is_safe_expression(expr: str) -> bool:
    allowed_chars = set('0123456789+-() ')
    for char in expr:
        if char not in allowed_chars:
            return False
    return True

def evaluate_expression(expr: str) -> int:
    if not is_safe_expression(expr):
        raise ValueError("Unsafe expression!")
    
    return int(eval(expr))

# Test cases
print(evaluate_expression('1+20'))  # 21
print(evaluate_expression('10-2+40'))  # 48
print(evaluate_expression('10- (1- 9)'))  # 18

# complete python
def evaluate_exp(expr: str) -> int:
    def operate(a, b, op):
        if op == '+':
            return a + b
        elif op == '-':
            return a - b
        return 0

    def compute():
        op = operators.pop()
        b = values.pop()
        a = values.pop()
        values.append(operate(a, b, op))

    values, operators = [], []
    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].isdigit():
                j += 1
            values.append(int(expr[i:j]))
            i = j
        elif expr[i] in "+-":
            while operators and operators[-1] in "+-":
                compute()
            operators.append(expr[i])
            i += 1
        elif expr[i] == '(':
            operators.append(expr[i])
            i += 1
        elif expr[i] == ')':
            while operators[-1] != '(':
                compute()
            operators.pop()  # pop the '('
            i += 1
    while operators:
        compute()
    return values[0]

# Test
print(evaluate_exp('1+20'))  # 21
print(evaluate_exp('10-2+40'))  # 48
print(evaluate_exp('10-(1-9)'))  # 18

# same logic written in cpp
https://pastecode.io/s/aakvx8rc
Editor is loading...