采用中缀转后缀的算法。

注意我输入的格式。

#注意格式
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. WEB ICON 的探讨

    一般考虑到webicon 就是cssSprite和自定义font:本文基于下述而总结和进行分析,如有笔误有望指出,谢谢 在线教程:用字体在网页中画ICON图标 http://www.imooc.com ...

  2. java的for循环问题的解决,以及安卓中ListView插入数据的问题

    package test.testdemo; import org.springframework.jdbc.core.JdbcTemplate; import com.util.Pub; publi ...

  3. centos安装epel源

    用163的源,但是我发现这个源里面,根本没有libmcrypt libmcrypt-devel这二个包,装php扩展mcrypt时,又要用到这二个包,所以我手动装了libmcrypt包,但是给我的感觉 ...

  4. ASP.NET PipeLine #Reprinted#

    从ASP.NET 1.0 起,相比于ASP中的COM, PipeLine 就是一项重大的改进. ASP.NET 时代的管道模型究竟是怎么样的? 我们能接触到的四个最重要的概念就是HttpApplica ...

  5. (IOS)截图Demo

    思路是建一个UIView的子类,获取划动出的矩形,用协议将矩形传递给代理对象,依据该矩形完成图像数据的截取,并显示出来. 截图视图类: #import <UIKit/UIKit.h> @p ...

  6. Visual Studio 2013 Xamarin for iOS 环境搭建

    原文:Visual Studio 2013 Xamarin for iOS 环境搭建 一.Mac安装Xamarin.iOS 1,我的Mac 环境:OSX 10.10.3.Xcode 6.3.2 (使用 ...

  7. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  8. 【Hibernate】HQL new map

    HQL 查询如果需要带出对象(比如:OneToOne子对象)的一两个属性,而不是全部带出.可以使用 select new map的方法带出. 1.lazy还是设置为false /**关联属性对象*/ ...

  9. iOS 拍照保存到相册

    之前看了一些开源的代码,里面有一个功能,就是将图片下载到相册,仔细看了其中的代码,只有很简单的一句话,并且保存过后,还可以判断是否保存成功. 如下代码所示, 点击按钮,将self.imageView上 ...

  10. Servlet中通过过滤器实现统一的手动编码(解决中文乱码)

    1.web.xml片段: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi= ...