python 求值表达式解析

来源:互联网 发布:网银软件下载 编辑:程序博客网 时间:2024/05/01 11:29

采用中缀转后缀的算法。

注意我输入的格式。


#注意格式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]         #maindictopt={"+":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

其实还有一种简单的方法解析算术表达式:

st="(1 + 2) * 3 - 5"val=eval(st)print val