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


 

 

你可能感兴趣的:(python)