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)
京公网安备 11010502036488号