本帖最后由 戴宇轩 于 2015-7-18 13:13 编辑
经过测试, 现在没有BUG了, 版本: Python 3.4.0
其他版本见 http://bbs.fishc.com/forum.php?mod=viewthread&tid=57828&page=1&extra=
密码: RPE2015
另外在此感谢 @Xiao_肚oO 为我指出了一个BUG
测试数据:
-(a+b*(c-d)/(d+e-f)) ------> a, b, *, c, d, -, /, d, e, +, f, -, +, -
a*(-b)/(c-d+e)*-f+(-g) ------> a, -b, *, /, c, d, -, e, +, -f, *, -g, +
-((a+b-c+d-e+f)*(g-h+i-j+k-((a+b-c+d-e+f)*(g-h+i-j+k)))) ------> a, b, +, c, -, d, +, e, -, f, +, *, g, h, -, i, +, j, -, k, +, a, b, +, c, -, d, +, e, -, f, +, *, g, h, -, i, +, j, -, k, +, -, -
规则:
1. 允许负数或带正号正数不带括号, 所以3-(-6)可以写成3--6
2. 一个数字可以带0~1个小数点(废话), 允许一个数以小数点开头, 但不允许以小数点结尾, 否则自动去掉小数点
3. 字母之间不可以带小数点(不是BUG), 其它规则见(规则1), 如dk--aas, osw-+hs都是合法的
4. 字母系数可以是所有大小写英文字母, 没有字数限制- import re;i,j,k='[0-9]*\\.?[0-9]+|','(?<=[(+/*-])[+-]','[a-zA-Z]+|';z,l,x,y=re.findall(i+j+i+k+j+k+'[()+/*-]','('+input('Enter an Infix Expression: ').replace(' ','')+')')[1:],{')':0,'(':1,'+':0,'*':1,'-':0,'/':1},['('],[]
- while z:
- if z[0]in l and z[0]==')':b=len(x)-x[::-1].index('(');y+=x[b:][::-1];del z[0],x[b-1:]
- elif z[0]in l and(x[-1]=='('or l[z[0]]>l[x[-1]]):x+=[z.pop(0)]
- elif z[0]in l and l[z[0]]<=l[x[-1]]:y+=[x.pop()];x+=[z.pop(0)]
- else:y+=[z.pop(0)]
- print('Reverse Polish Expression: '+', '.join(y))
复制代码
|