''' 解题思路: 1、中缀表达式转为后缀表达式 2、为后缀表达式计算规则:从左到右遍历表达式的每个数字和符号,遇到的是数字就进栈, 遇到的时符号就将栈顶的两个数字出栈进行计算,然后将计算结果入栈,最终栈里的值即为计算的结果。 3、预处理:将字符串按实际物理意义,转成字符列表(含多位数和负数、空格、[]、{}) ''' #---------------------------------------- # 输出num1 + operator + num2结果 def getvalue(num1,num2,operator): if operator == '+': return num1 + num2 elif operator == '-': return num1 - num2 elif operator == '*': return num1 * num2 elif operator == '/': return num1 / num2 else: return [] #---------------------------------------- # 优先级 operator1 >= operator2,输出真 def compare(operator1,operator2): if operator1 in '*/' and operator1 in '*/': return True elif operator1 in '+-' and operator1 in '+-': return True elif operator1 in '*/' and operator1 in '+-': return True elif operator1 in '+-' and operator1 in '*/': return False else: return [] #---------------------------------------- # 中缀表达式转为后缀表达式 # 输入L = ['0','-','1','*','(','0','-','1','-','1',')','-','3','*','(','1','-','2',')','-','3','*','4'] # 输出express= ['0',1','0','1','-','1','-','*','-','3','1','2','-','*','-','3','4','*','-'] def suffix_express(L): express = [] # 后缀表达式 stack = [] # 存中间符号的栈 for i in L: if i.isnumeric(): # 数字直接入表达式 express.append(i) elif i in '+-': # 遇到+—号,如果符号栈空,入符号栈 if len(stack) == 0: stack.append(i) else: # 如果符号栈不为空,符号栈优先级大于等于当前符号的,弹出入表达式 while stack and compare(stack[-1],i): express.append(stack.pop()) stack.append(i) # 当前符号入符号栈 elif i in '*/(': # */(直接入符号栈 stack.append(i) elif i in ')': # 遇到),(之前的符号弹出入表达式 while stack and stack[-1] != '(': express.append(stack.pop()) if stack: # 删除( stack.pop() while stack: # 最后栈中所有符号弹出入表达式 express.append(stack.pop()) return express #---------------------------------------- # 为后缀表达式计算规则: # 从左到右遍历表达式的每个数字和符号,遇到的是数字就进栈,遇到的时符号就将栈顶的两个数字出栈进行计算, # 然后将计算结果入栈,最终栈里的值即为计算的结果。 # 输入express= ['0',1','0','1','-','1','-','*','-','3','1','2','-','*','-','3','4','*','-'] # 输出计算结果 = result def compute(suffix_express): stack = [] for i in suffix_express: if i.isnumeric(): stack.append(i) elif i in '+-*/': n2 = stack.pop() n1 = stack.pop() stack.append(getvalue(int(n1),int(n2),i)) if stack: return stack.pop() return [] #---------------------------------------- # 预处理:将字符串按实际物理意义,转成字符列表(含多位数和负数、空格、[]、{}) # 输入:-1*(-1-1)-3*(1-2)-3*4 # 输出:['0','-','1','*','(','0','-','1','-','1',')','-','3','*','(','1','-','2',')','-','3','*','4'] def preprocess(L): B = '' for i in L: if i in '0123456789+-*/()[]{}': # 去空格 B += i B = B.replace('[','(') # 统一括号 B = B.replace(']',')') B = B.replace('{','(') B = B.replace('}',')') L = '('+ B +')' # 左右加括号用于判断负号 A = [] tmp = '' for i in range(1,len(L)-1): if L[i] == '-' and L[i-1]=='(': # 负号前必有括号,前加0将负号变减号 A.append('0') A.append('-') elif L[i].isnumeric() and L[i+1].isnumeric(): tmp += L[i] elif L[i].isnumeric() and not L[i+1].isnumeric(): tmp += L[i] A.append(tmp) tmp = '' else: A.append(L[i]) return A String = input() #String = '-1*(-1-1)-3*(1-2)-3*4' #print(String) List = preprocess(String) #print(List) express = suffix_express(List) #print(express) result = compute(express) print(result)