编程实现:简单算术题计算器
编程实现:简单算术题计算器
题目描述:
给定一道没有括号的四则混合运算算术题(可能包含多余的空格),请编程计算出结果。
运算规则如下:
- 既有乘、除法又有加、减法的,要先算乘除法,再算加减法
- 同级运算时,要从左往右按顺序计算
- 所有除法运算的结果都只保留整数部分(直接舍弃小数部分)
例如:当算术题为 '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
代码解释:
calculate(expression)函数是主函数,接收算术表达式作为参数,返回计算结果。- 函数使用两个栈:
number_stack存储数字,operator_stack存储运算符。 - 遍历表达式,将数字压入
number_stack,将运算符压入operator_stack。 - 在压入运算符之前,判断栈顶运算符优先级是否大于等于当前运算符。如果是,则弹出栈顶运算符进行计算,直到栈顶运算符优先级小于当前运算符,然后将当前运算符压入。
get_priority(operator)函数用于获取运算符的优先级。calculate_operation(left_operand, right_operand, operator)函数用于执行具体的运算。- 最后,当遍历完表达式后,从栈中依次弹出运算符和数字进行计算,最终得到结果。
注意事项:
- 代码中使用
//表示整除运算,保留整数部分。 - 代码中对输入字符串进行了简单的处理,去除空格。
- 为了简化代码,没有对输入字符串进行完整性验证,实际应用中需要进行更严格的验证。
希望这篇文章能够帮助您理解算术题的编程实现方法。
原文地址: http://www.cveoy.top/t/topic/ojHC 著作权归作者所有。请勿转载和采集!