zoukankan      html  css  js  c++  java
  • python 求值表达式解析

    采用中缀转后缀的算法。

    注意我输入的格式。


    #注意格式
    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
    


  • 相关阅读:
    重回大一
    20071027我以为我很大度
    凌晨三点
    山洞爱情
    JQuery上传插件Uploadify使用详解
    jquery ui layout
    win2003下direct的问题
    Aptana一些快键用法
    IE、Firefox、Chrome 的JS代码兼容注意事项
    2011学习计划
  • 原文地址:https://www.cnblogs.com/james1207/p/3297306.html
Copyright © 2011-2022 走看看