采用中缀转后缀的算法。

注意我输入的格式。

#注意格式
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. flash builder 4 编译器参数

    accessible=true|false 是否具有可理解性(如为残疾人提供方便的性能) actionscript-file-encoding | 设置文件编码,如Shitf_JIS advanced ...

  2. CSS——图片替换方法比较

    图片替换主要是指将文字替换成图片的技术,即在html语句中使用文字,浏览器显示时用对应的图片显示.其意义在于便于做网站优化(SEO),文字才是搜索引擎寻找的主要对象. 经典的替换方法: Fahrner ...

  3. [Git]自译《Git版本控制管理》——1.介绍(二)_Git诞生

    译者前言:      本系列译文为作者利用业余时间翻译,有些疏漏与翻译不到位的地方敬请谅解.      不过也很希望各位读者能给出中肯的建议.      方括号的注释,如[1][2]为译者注.     ...

  4. javascript学习(9)——[设计模式]单例

    单例模式,相信大家对此都不陌生,我们主要讲下javascript中几个比较常见的设计模式: (1).普通的单体 (2).具有局部变量的强大单体 (3).惰性单体 (4).分支单体 下面我们就一一进行介 ...

  5. Android操作HTTP实现和服务器通信

    众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HT ...

  6. Django问题汇总

    Q1.运行python manage.py runserver后,出现如下错误(CentOS6.5x86,Python2.7.12,Django1.10): django.core.exception ...

  7. Linux系统目录(转载)

    /         (这就是著名的根)├── bin         (你在终端运行的大多数程序,比如cp.mv...)├── boot         (内核放在这里,这个目录也经常被作为某个独立分 ...

  8. open和fopen的区别:

    1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量.执行 ...

  9. vs2010 条件断点 has changed是什么意思?

    在vs2010 断点设置 condition里,有2个选项可以选择: 一个是true,另个是has changed,true好理解,如果表达式为真则停止.但是has changed是什么意思.看了官网 ...

  10. 响应式Web图形篇 —— icon fonts 的探析及应用

    前言 像素完美(Pixel Perfection).分辨率无关(Resolution Independent)和多平台体验一致性是设计师们的追求. 可访问性(Accessability).加载性能和重 ...