ONP - Transform the Expression问题的python实现

原题链接

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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;   2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如[removed]、、<iframe>);   3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;   4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;   5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。   6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。   7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值