题目
代码
碎碎念:我用来复习栈的,刷了巨长时间,一直Runtine Error,编译直接就没有过。
好家伙,然后发现是数据给的不够严谨,左右两端有空格,使用strip()处理一下就好了。
# 栈结构
class Stack:
def __init__(self,*args):
self.items = [i for i in args]
def __str__(self):
return str(self.items)
def push(self,item):
self.items.append(item)
def pop(self):
return self.items.pop()
def is_empty(self):
return self.items == []
def peek(self):
return self.items[-1]
# 返回最后一个元素
def size(self):
return len(self.items)
def show(self):
return self.items
def clear(self):
self.items = []
# 中缀表达式 => 后缀表达式
# LG P1175 表达式的转换
def change_expression(s: str):
dic = {
"(": 0,
"^": 3,
"*": 2,
"/": 2,
"+": 1,
"-": 1
}
stack = Stack() # 存储符号
res = [] # 放答案
for i in s:
# 操作符
if i in ['+', '-', '*', '/', '^']:
# 要先取出优先级更高的,或者相等的运算符
while (not stack.is_empty() and dic[stack.peek()] >= dic[i]):
res.append(stack.pop())
stack.push(i)
elif i == '(':
stack.push(i)
elif i == ')':
top_token = stack.pop()
while (top_token != '('):
res.append(top_token)
top_token = stack.pop()
else:
# 运算数
res.append(i)
# 剩余元素全部加入
while not stack.is_empty():
res.append(stack.pop())
return " ".join(res)
def calc_postfix_expression(s: str):
# 计算后缀表达式
stack = Stack()
# start 方便输出
temp = list(s)
index = 0
# end 方便输出
for i in s:
if i in "0123456789":
# 运算数
stack.push(int(i))
else:
# 运算符
op2 = stack.pop()
op1 = stack.pop()
ans = do_math(i, op1, op2)
stack.push(ans)
# start 输出依次结果
before = temp[0:index-2]
before.append(str(ans))
out = before + temp[index+1:]
temp = out
index = index - 2
print(" ".join(out))
# end 输出结果
index += 1
return stack.pop()
def do_math(op, op1, op2):
if op == '+':
return op1+op2
elif op == '-':
return op1-op2
elif op == '*':
return op1*op2
elif op == '/':
return op1//op2
elif op == '^':
return op1**op2
if __name__ == '__main__':
# 对于题目中的输入字符串一定要小心(如果比赛题目不严谨,会导致很多问题,最后strip()一下)
expression = input().strip()
res = change_expression(expression)
# res = change_expression("(1+2)*3-4")
print(res) # 输出结果
calc_postfix_expression(res.replace(" ", ""))
# print(ans)