import re def is_operator(operator): #判断是否为运算符 operators = ['+', '-', '*', '/', '(', ')'] if operator in operators: return True else: return False def calculate(n1, n2, operator): #对参数进行运算 result = 0 if operator == "+": result = n1 + n2 if operator == "-": result = n1 - n2 if operator == "*": result = n1 * n2 if operator == "/": result = n1 / n2 return result def formula_format(formula): formula = re.sub(' ', '', formula) # 去掉表达式式中的空格 formula_list = [i for i in re.split('(\-\d+\.?\d*)', formula) if i] # 以 '-' + '数字' 分割表达式 final_formula = [] # 创建最终的表达式列表 for item in formula_list: if len(final_formula) == 0 and re.search('^\-\d+\.?\d*$', item): # 判断第一个是以横杠开头的数字是不是负数。 final_formula.append(item) elif len(final_formula) > 0: if re.search('[\+\-\*\/\(]$', final_formula[-1]): # 判断表达式列表中最后一个是不是运算符号 final_formula.append(item) else: #分割表达式并写入表达式列表 item_split = [i for i in re.split('([\+\-\*\/\(\)])', item) if i] final_formula += item_split else: #分割表达式并写入表达式列表 item_split = [i for i in re.split('([\+\-\*\/\(\)])', item) if i] final_formula += item_split return final_formula #返回最终的表达式列表 def decision(tail, now): #tail是栈顶元素,now是当前元素 # 定义4种运算符优先度 rank1 = ['+', '-'] rank2 = ['*', '/'] rank3 = ['('] rank4 = [')'] if tail in rank1: if now in rank2 or now in rank3: # 说明连续两个运算优先级不一样,需要入栈 return -1 else: return 1 elif tail in rank2: if now in rank3: return -1 else: return 1 elif tail in rank3: if now in rank4: return 0 # 如果'(' 遇上 ')' 需要出栈 '(' else: return -1 # 只要栈顶元素为'(',当前元素不是')',都应入栈。 else: return -1 def final_calc(formula_list): num = [] # 定义数字栈 operators = [] # 定义运算符栈 for x in formula_list: operator = is_operator(x) # 调用函数判断,具体函数比较简单不详细介绍,在下面会给出 if not operator: # 判断是否为运算符,否则压入数字栈 num.append(float(x)) # 将字符串转换为浮点数进行运算,防止数值类型在运算中出现错误 else: # 运算符处理 while True: if len(operators) == 0: # 如果运算符栈等于0无条件入栈 operators.append(x) break tag = decision(operators[-1], x) # 调用 decision 函数判断运算符优先级 if tag == -1: operators.append(x) # 如果是-1压入运算符栈进入下一次循环 break elif tag == 0: operators.pop() # 如果是0弹出运算符栈内最后一个'(', 丢掉当前')',进入下一次循环 break elif tag == 1: op = operators.pop() # 如果是1弹出运算符栈内最后两个元素,弹出数字栈最后两位元素。 num2 = num.pop() num1 = num.pop() num.append(calculate(num1, num2, op)) # 将运算之后的结果压入数字栈中 while len(operators) != 0: # 判断是否还有未处理的元素 op = operators.pop() num2 = num.pop() num1 = num.pop() num.append(calculate(num1, num2, op)) return num , operators x=1 #主函数,写了一个循环 while(x): try: print("请输入您的计算式") formula = input() formula_list = formula_format(formula) result ,_= final_calc(formula_list) print("计算结果:", result[0]) x=int(input("是否继续运算? Yes for 1 / No for 0\n")) except ValueError: print("请正确输入计算式") print("谢谢使用,再见!")