1、解题思路,将中缀表达式转为后缀表达式,最后是表达式求值
2、转后缀表达式 当前操作符优先级大于栈定优先级, 直接入栈,当前操作符优先级小于等于栈定优先级, 和栈里面所有操作依次比较,直到碰到栈里面的优先级小于它,它再入栈
3、表达式求值 当遇到操作符时,将栈顶的两个数字pop出来和对应的操作符进行计算,计算出来的值再压入栈顶。不断循环指导最后一个计算完成
def suffix_expression(infix_expression): operator_symbol_level = { '(': 1, '+': 2, '-': 2, '*': 3, '/': 3, } # 定义操作符优先级 result = [] # 用来存放后缀表达式的列表 operator_symbol = [] # 存放操作符 temp_number = '' # 存放临时多位数字 flag_number = '' # 识别-这个操作符 是减号还是负号 for item in range(len(infix_expression)): # 循环 对每个字符进行判断 if infix_expression[item].isdigit(): temp_number = temp_number + infix_expression[item] # 如果是数字先不放入result里面,例如789,不这样判断会将7/8/9分别放入 if item == (len(infix_expression)-1): # 最后一位数字直接放入result里面 result.append(flag_number+temp_number) flag_number = '' if infix_expression[item] == ")": # 往下找,找到(为止,把他们之间的操作都输出到result if temp_number: result.append(flag_number+temp_number) # 确定碰到是操作符 再放入result里面 多个数字时生效 temp_number = '' flag_number = '' for j in range(len(operator_symbol)): if operator_symbol[-1] == "(": break result.append(operator_symbol.pop()) operator_symbol.pop() # 删除( continue if infix_expression[item] == "(": # 直接放入操作符列表里面 if temp_number: result.append(flag_number+temp_number) # 确定碰到是操作符 再放入result里面 多个数字时生效 temp_number = '' flag_number = '' operator_symbol.append(infix_expression[item]) continue # 管什么 直接放进去 if infix_expression[item] in operator_symbol_level.keys(): # 如果是 +-*/ 就进行预算符之间的优先级比较 if temp_number: result.append(flag_number+temp_number) # 确定碰到是操作符 再放入result里面 多个数字时生效 temp_number = '' flag_number = '' if infix_expression[item] == '-': if item == 0 or infix_expression[item-1] in operator_symbol_level.keys(): flag_number = '-' continue if len(operator_symbol) == 0: # 如果是空栈,直接加入 operator_symbol.append(infix_expression[item]) else: if operator_symbol_level[infix_expression[item]] > operator_symbol_level[operator_symbol[-1]]: # 当前操作符优先级大于栈定优先级, 直接入栈 operator_symbol.append(infix_expression[item]) else: # 当前操作符优先级小于等于栈定优先级, 和栈里面所有操作依次比较,直到碰到栈里面的优先级小于它,它再入栈 for i in range(len(operator_symbol)): if operator_symbol_level[infix_expression[item]] <= operator_symbol_level[operator_symbol[-1]]: result.append(operator_symbol.pop()) # 把栈定的取出来放到结果里面 else: break operator_symbol.append(infix_expression[item]) if operator_symbol: for i in range(len(operator_symbol)): result.append(operator_symbol.pop()) return result def infix_expression_evaluation(suffix_expression1): result1 = [] string_level = '-+*/' for j in range(len(suffix_expression1)): # 处理 '-1' 不能判断为数字问题 if suffix_expression1[j] in string_level: continue else: suffix_expression1[j] = int(suffix_expression1[j]) for i in suffix_expression1: if type(i) == int: result1.append(i) else: po1 = result1.pop() po2 = result1.pop() if i == "+": result1.append(po2 + po1) if i == "-": result1.append(po2 - po1) if i == "*": result1.append(po2 * po1) if i == "/": result1.append(po2 // po1) print(result1[0]) if __name__ == '__main__': num = input() num = num.replace('[', '(') num = num.replace(']', ')') num = num.replace('{', '(') num = num.replace('}', ')') b = suffix_expression(num) infix_expression_evaluation(b)