编程实现:简单算术题计算器

题目描述:

给定一道没有括号的四则混合运算算术题(可能包含多余的空格),请编程计算出结果。

运算规则如下:

  1. 既有乘、除法又有加、减法的,要先算乘除法,再算加减法
  2. 同级运算时,要从左往右按顺序计算
  3. 所有除法运算的结果都只保留整数部分(直接舍弃小数部分)

例如:当算术题为 '2 + 3 * 4 - 10 / 6 + 1 / 2 * 4' 时,优先计算乘除法,有 34=12,10/6=1,1/24=0;然后再计算加减法,2+34-10/6+1/24=2+12-1+0=13,故输出 13。

输入描述 输入一个字符串,表示算术题,5≤字符串长度≤100000,字符串中只包含数字字符以及'+'、'-'、'*'、'/'运算符,不含括号,可能包含空格;

算式中的运算数范围:1≤运算数≤200。

输出描述 输出一个整数,表示算术题的计算结果。

题目数据保证算式的每一步运算的结果都在-2×10^9~2×10^9之间。

样例输入 '2 + 3 * 4 - 10 / 6 + 1 / 2 * 4'

样例输出 13

解题思路:

模拟整个计算过程,维护两个栈,分别存储数字和运算符,遍历算术题的每一个字符,进行相应的处理。如果是数字字符,就把它转换成数字,压入数字栈;如果是运算符,就把它压入运算符栈。

在压入运算符之前,需要判断栈顶的运算符是否优先级大于等于当前运算符,如果是,则需要先把栈顶运算符弹出进行计算,直到栈顶运算符优先级小于当前运算符,然后再把当前运算符压入。

最后,按照规则计算得到最终结果。

注意除法运算需要特殊处理,只保留整数部分。

时间复杂度:O(n)

参考代码:

def calculate(expression):
    number_stack = []
    operator_stack = []
    i = 0
    while i < len(expression):
        if expression[i].isdigit():
            num = 0
            while i < len(expression) and expression[i].isdigit():
                num = num * 10 + int(expression[i])
                i += 1
            number_stack.append(num)
            i -= 1
        elif expression[i] in '+-*/':
            while operator_stack and get_priority(expression[i]) <= get_priority(operator_stack[-1]):
                right_operand = number_stack.pop()
                left_operand = number_stack.pop()
                operator = operator_stack.pop()
                number_stack.append(calculate_operation(left_operand, right_operand, operator))
            operator_stack.append(expression[i])
        i += 1
    while operator_stack:
        right_operand = number_stack.pop()
        left_operand = number_stack.pop()
        operator = operator_stack.pop()
        number_stack.append(calculate_operation(left_operand, right_operand, operator))
    return number_stack[0]

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

def calculate_operation(left_operand, right_operand, operator):
    if operator == '+':
        return left_operand + right_operand
    elif operator == '-':
        return left_operand - right_operand
    elif operator == '*':
        return left_operand * right_operand
    elif operator == '/':
        return left_operand // right_operand

# 测试用例
expression = '2 + 3 * 4 - 10 / 6 + 1 / 2 * 4'
result = calculate(expression)
print(result) # 输出 13

代码解释:

  1. calculate(expression) 函数是主函数,接收算术表达式作为参数,返回计算结果。
  2. 函数使用两个栈:number_stack 存储数字,operator_stack 存储运算符。
  3. 遍历表达式,将数字压入 number_stack,将运算符压入 operator_stack
  4. 在压入运算符之前,判断栈顶运算符优先级是否大于等于当前运算符。如果是,则弹出栈顶运算符进行计算,直到栈顶运算符优先级小于当前运算符,然后将当前运算符压入。
  5. get_priority(operator) 函数用于获取运算符的优先级。
  6. calculate_operation(left_operand, right_operand, operator) 函数用于执行具体的运算。
  7. 最后,当遍历完表达式后,从栈中依次弹出运算符和数字进行计算,最终得到结果。

注意事项:

  • 代码中使用 // 表示整除运算,保留整数部分。
  • 代码中对输入字符串进行了简单的处理,去除空格。
  • 为了简化代码,没有对输入字符串进行完整性验证,实际应用中需要进行更严格的验证。

希望这篇文章能够帮助您理解算术题的编程实现方法。

编程实现:简单算术题计算器

原文地址: http://www.cveoy.top/t/topic/ojHC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录