采用中缀转后缀的算法。

注意我输入的格式。

#注意格式
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. URAL 1203 Scientific Conference dp?贪心

    题目:click here 分明就是贪心怎么会在dp的专题 #include <bits/stdc++.h> using namespace std; typedef unsigned l ...

  2. Stbdroid之ShapeDrawable

    Shape可以定义矩形.椭圆形.线条.圆形 <?xml version="1.0" encoding="utf-8"?> <shape xml ...

  3. Binary Tree Preorder Traversal and Binary Tree Postorder Traversal

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  4. mysql存储过程详解[转]

    1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...

  5. php定时自动执行 需启动第一次

    1 2 3 4 5 6 7 8 9 10 11 12 <? ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_li ...

  6. python and 和 or

    在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样.但是它们并不返回布尔值,而是返回它们实际进行比较的值之一. 例 4.15. and 介绍 >>> 'a' a ...

  7. 学校作业-Usaco DP水题

    好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性[好的,这么简单的题,再不写对,你就可以滚粗了! 第一题是USACO 2.2.2 ★Subset Sums 集合  对于从 1 到 N 的连 ...

  8. Android短彩信源码解析-短信发送流程(二)

    转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935 2,短彩信发送framework逻辑 短信在SmsSingleRecipien ...

  9. 域用户允许更改IP地址

    1.在DC上设置不好使. 2.需在本地用户组里添加到network.......组里. 注意:有的时候,连接不到DC上,是由于DNS的事,需要先去掉不必要的dns地址. 添加完后,需要重启或注销. 另 ...

  10. PHP - 直接输出对象的版本问题