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)
相关文章推荐
- Python进阶语法
- Python入门简单的静态网页爬虫
- 《机器学习实战》Logistic回归算法(1)
- python中列表、元组、字典的区别
- 关于python中的__new__方法
- 关于python中的__new__方法
- Python字符串内置方法
- Python简单实现enum功能的方法
- python版本的读写锁操作方法
- 使用Python3.5爬取豆瓣电影Top250
- python浓缩(18)多线程编程
- 1.1Python快速入门
- 1.2Python快速入门
- python列表推导式
- Python静态网页爬虫相关知识
- python开发中常见的小坑
- Java及Python连接SQL Server数据库
- Python的三种代码续行书写方法
- 9.4 marshal--Python内部对象序列化
- 9.4 marshal--Python内部对象序列化