您的位置:首页 > 编程语言 > Python开发

ONP - Transform the Expression问题的python实现

2016-04-25 00:48 621 查看

原题链接

http://www.spoj.com/problems/ONP/

由题目可知,是把中缀表达式转换为后缀表达式(又称逆波兰表达式);

关于逆波兰式,我比较懒,没去翻书,可以参考下这篇博文:http://www.cnblogs.com/wanghetao/archive/2012/04/23/2466580.html

说明

博客里面作者对算法,对"("出栈处理没写清楚,我把它详细化了;还有对于运算符栈,里面的括号判断,因为右括号没有入栈,所以只需要判断左括号。

关于运算符优先级比较,我这里用了一个字典来定义,每个运算符映射到一个整数,数值越大,优先级越高;其它思路见下面内容。

算法核心

1. 从左往右扫描表达式;

2. 若读取的是操作数,则将该操作数存入操作数堆栈;

3. 若读取的是运算符:

3.1. 若运算符为左括号"(",则直接存入运算符堆栈;

3.2. 该运算符为右括号")",则运算符堆栈持续出栈,直到出栈的运算符不是"("时停止,并把运算输出到操作数堆栈;

3.3. 该运算符为非括号运算符:

3.3.1. 若运算符堆栈栈顶的运算符为"(",则直接存入运算符堆栈;

3.3.2. 若比运算符堆栈栈顶的运算符优先级高或相等,则直接存入运算符堆栈;

3.3.3. 若比运算符堆栈栈顶的运算符优先级低,则输出栈顶运算符到操作数堆栈,并将当前运算符压入运算符堆栈;

4. 当表达式读取完成后运算符堆栈中尚有运算符时,并且运算符不是"(",则依序取出运算符到操作数堆栈,直到运算符堆栈为空。

python实现

priority = {'+':0, '-':1, '*':2, '/':3, '^':4}
stack_number = []
stack_operator = []
output = ""
line = input()
for t in range(line):
s = raw_input()
for i in s:
if i.isalpha():
stack_number.append(i)
elif i == '(':
stack_operator.append(i)
elif i == ')':
c = stack_operator.pop(-1)
while c == '(':
c = stack_operator.pop(-1)
if c != '(':
stack_number.append(c)
elif i in priority:
if stack_operator[-1] == '(':
stack_operator.append(i)
elif priority[i] >= priority[stack_operator[-1]]:
stack_operator.append(i)
else:
stack_number.append(stack_operator.pop(-1))
stack_operator.append(i)
else:
exit(0)
while len(stack_operator) != 0:
c = stack_operator.pop(-1)
if c != '(':
stack_number.append(c)

# OUTPUT
for j in stack_number:
output += j
if t != line-1:
output += "\n"
stack_number
stack_number = []
stack_operator = []
print(output)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: