采用中缀转后缀的算法。

注意我输入的格式。

#注意格式
def suffix(st):
listopt=[" "]
listnum=[" "] for i in range(0,len(st)):
if(differ(st[i])==1): #判断,对运算符操作
if(len(listopt)):
if(dictopt[st[i]] > dictopt[listopt[len(listopt)-1]]):#优先级比栈顶高,入栈
if st[i]==")":
while(1):
tmp=listopt.pop()
if tmp=="(":
break
else:
listnum.append(tmp)
listnum.append(" ")
else:
listopt.append(st[i]) else: #如果st[i]优先级比栈顶低,opt栈中依次放到num中,然后再把st[i]入opt栈
if st[i]=="(": #优先级低于栈顶元素的,可能是 加减乘除,也可能是"("。如果碰到 "("则 直接入栈
listopt.append(st[i])
else:
while(dictopt[st[i]]<dictopt[listopt[len(listopt)-1]] and len(listopt)!=0):#碰到的是 加减乘除
tmp=listopt.pop()
listnum.append(tmp)
listnum.append(" ") #运算符之间加空格,否则print cnt_string:“ 1.2 5 6 ** 57 14 - + ”
listopt.append(st[i])
else: #非运算符的操作,依次入num栈
listnum.append(st[i])
while(len(listopt)): #opt栈 依次放到 num栈
listnum.append(" ") #运算符前面加空格,否则print cnt_string:“ 1.2 5 6 * * 57 14-+ ”
listnum.append(listopt.pop())
return listnum #判断是运算符还是操作数:
def differ(elem):
if elem=="+" or elem=="-" or elem=="*" or elem=="/" or elem=="(" or elem==")":
return 1
else:
return 0
#整理字符串,列表,去除不必要的空格:
def order(st):
suffix_list=[]
tmp_list=suffix(st)
#print suffix_list
last_string="".join(tmp_list)
#print last_string
cnt_string=last_string.replace(" "," ")
#print cnt_string
cnt_string=cnt_string[1:len(cnt_string)-1] #空格去头去尾
cnt_list_tmp=cnt_string.split(" ")
for i in cnt_list_tmp:
if i!="":
suffix_list.append(i)
print suffix_list
return suffix_list #实现类似switch-case 功能:
def calc(type,x,y):
calculation = {"+":lambda x,y:( eval(x) + eval(y)),
"*":lambda x,y:( eval(x) * eval(y)),
"-":lambda x,y:( eval(x) - eval(y)),
"/":lambda x,y:( eval(x) / eval(y))
}
return calculation[type](x,y) #usage :result1 = calc('+',3,6) #计算:
def count(suffix_list):
tmp_list=[]
for i in suffix_list:
if not differ(i):
tmp_list.append(i)
else:
tmp1=tmp_list.pop()
tmp2=tmp_list.pop()
tmp3=calc(i,str(tmp2),str(tmp1))
tmp_list.append(tmp3)
return tmp_list[0] #main
dictopt={"+":1,"-":1,"*":2,"/":2," ":0,"(":-1,")":9} #优先级
st="1.2 - ( 5 * 6 + 7 + 8 ) * 4"#待求表达式
suffix_list=order(st)
answer=count(suffix_list)
print answer

python 求值表达式解析的更多相关文章

  1. 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计

    1,表达式的求值顺序与堆栈结构 “表达式” 是程序语言一个很重要的术语,也是大家天天写的程序中很常见的东西,但是表达式的求值顺序一定是从左到右么? C/C++语言中没有明确规定表达式的运算顺序(从左到 ...

  2. Excel求值表达式——太好用了

    这个需要通过宏表函数EVALUATE来实现,首先需要自定义名称.如果数据在A列,那么在B列自定义名称,按Ctrl+F3键,在“定义名称框”中选择“新建”,然后输入名称为“结果”,数据来源输入=EVAL ...

  3. 求值器本质--eval&apply

    最近跟着(How to Write a (Lisp) Interpreter (in Python))使用python实现了一个简易的scheme解释器.不得不说使用python这类动态语言实现不要太 ...

  4. Python解析 算数表达式求值 栈的使用

    使用Python实现一种算数表达式求值的算法,模拟这种使用栈的方式,这是由E.W.Dijkstra在20世纪60年代发明的一种非常简单的算法.代码模拟仅仅表现一种编程思想,代码的逻辑并不完全: if ...

  5. 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)

    定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...

  6. 【python】Leetcode每日一题-逆波兰表达式求值

    [python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...

  7. 在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式

    在进行项目开发的时候,刚好需要用到对字符串表达式进行求值的处理场景,因此寻找了几个符合要求的第三方组件LambdaParser.DynamicExpresso.Z.Expressions,它们各自功能 ...

  8. Java 计算数学表达式(字符串解析求值工具)

    Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单. 这个工具中包含两个类 Calculator 和 ArithHelper Calc ...

  9. python 中的列表解析和生成表达式 - 转

    优雅.清晰和务实都是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(  List comprehensions)和生成表达式,通过这两 ...

随机推荐

  1. python开发环境安装

    1.首先安装python-3.4.2.msi,此为python主程序,双击安装,根据自身的情况做选择,也可以使用默认设置,一路next也没什么问题. 2.设置环境变量=>编辑Path,在最后加上 ...

  2. 使用RadioGroup与RadioButton实现多选一

    RadioGroup是RadioButton的集合, RadioGroup里面可以包含很多RadioButton,提供多选一机制,只能选择其中一个 RadioGroup的orientation(方向) ...

  3. github每次push都需要密码以及用户名的解决办法

    git remote set-url origin git@github.com:你的账户/项目名称.git就可以直接git push origin master了.

  4. 高级UNIX环境编程3 FILE IO

    POSIX中,STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO 对应0,1,2 每个打开的文件都有一个与其想关联的 "current file offset& ...

  5. background-position 个人理解

    background-position这里先说像素  百分比比较复杂background-position:xxpx xxpx  这里第一个值指的是x轴坐标  第二个值是y轴坐标这里使用的坐标系和数学 ...

  6. JAVA GUI学习 - 窗体背景图片设置方法:重写paintComponent(Graphics g)方法

    public class BackgroundImage extends JFrame { public BackgroundImage() { this.setTitle("窗体背景图片设 ...

  7. cocos2d-x3.6 连连看连通画线

    我的博客:http://blog.csdn.net/dawn_moon 网上看到非常多人写的连连看,都没有画连线的实现.事实上要话连线挺简单的.cocos2d-x 提供了一个非常方便的绘图形的类.Dr ...

  8. [Swust OJ 856]--Huge Tree(并查集)

    题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...

  9. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. Ubantu指令收藏

    Ubuntu常用命令大全,学习ubuntn系统的朋友可以收藏下,用ctrl+F查找即可   一.文件/文件夹管理 ls 列出当前目录文件(不包括隐含文件) ls -a 列出当前目录文件(包括隐含文件) ...