中缀表达式,运算符放两个操作数中间的,考虑运算顺序,通用记法。
后缀表达式(逆波兰),指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。
后缀表达式存在的目的在于便于计算机通过栈操作计算
中缀表达式转后缀表达式:
以表达式1+(2-3)*4-5/67
为例
顺序读入表达式,遵循以下规则:
- 遇到数字直接输出
- 符号栈空或遇到左括号时,直接将符号入栈
- 遇到右括号,符号出栈并输出直到遇到左括号(左括号不输出)
- 遇到其他运算符(加减乘除),不断与栈顶符号对比,若优先级不高于栈顶符号,则输出栈顶符号,否则入栈
- 最后,将栈中操作符依次输出
代码实现:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52# 中缀转后缀
s = input()
t = []
res = ''
operator = {
'+': 0,
'-': 0,
'*': 1,
'/': 1,
}
last_isnum = 0
for i in s:
if i not in ['+','-','*','/','(',')']: #数字直接输出
if last_isnum:
res += i
else:
res += ' '+i
last_isnum = 1
elif i == '(': #处理左括号
last_isnum = 0
t.append(i)
elif i == ')': #处理右括号
temp = t.pop()
while temp is not '(':
if last_isnum == 1:
res += ' '
res += temp
temp = t.pop()
last_isnum = 0
else: #其他操作符处理
while t:
top = t.pop()
if top is not '(' and operator[i] <= operator[top]:
if last_isnum == 1:
res += ' '
res += top
pass
else:
t.append(top)
break
t.append(i)
last_isnum = 0
while t:
res += ' '+t.pop()
print(res.strip())
>>> 1+(2-3)/4-5/67
1 2 3 - 4 / + 5 67 / -
后缀表达式转中缀表达式
以表达式1 2 3 - 4 / + 5 67 / -
为例
顺序读入表达式,遵循以下规则:
- 遇到非运算符,直接入栈
- 遇到运算符,从栈中弹出最上层两个元素,并与运算符组合,将结果入栈
代码实现:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# 后缀转中缀
res = 0
s = input()
s = s.split(' ')
t = []
for i in s:
if i not in ['+','-','*','/']:
t.append(i)
else:
temp1 = t.pop()
temp2 = t.pop()
if i == '+':
temp = '('+temp2+'+'+temp1+')'
elif i == '-':
temp = '('+temp2+'-'+temp1+')'
elif i == '*':
temp = temp2+'*'+temp1
elif i == '/':
temp = temp2+'/'+temp1
t.append(temp)
print(t)
print(t.pop())
>>> 1 2 3 - 4 / + 5 67 / -
((1+(2-3)/4)-5/67)