zoukankan      html  css  js  c++  java
  • 四则运算练习

    递归:

    def oper_two(num_one, oper, num_two):
        if oper == '+':
            return str(int(num_one) + int(num_two))
        if oper == '-':
            return str(int(num_one) - int(num_two))
        if oper == '*':
            return str(int(num_one) * int(num_two))
        if oper == '/':
            if num_two != '0':
                return str(int(num_one) / int(num_two))
        print 'oper_two error!'
    
    #a = oper_two('4', '/', '2')
    #print a
    
    def compute_str(mystr):
        print "str is: " , mystr
        if len(mystr) < 4:
            return oper_two(mystr[0], mystr[1], mystr[2])
        if mystr[1] == '*' or mystr[1] == '/':
            return compute_str(compute_str(mystr[0:3]) + mystr[3:])
        elif mystr[3] == '*' or mystr[3] == '/':
            return compute_str(mystr[0:2] + compute_str(mystr[2:5]) + mystr[5:])
        else:
            return compute_str(compute_str(mystr[:3]) + mystr[3:])
    
    
    def compute_allstr(allstr):
        print "allstr is:" , allstr
        first = allstr.find('(')
        last = allstr.rfind(')')
    #    print first , 'and', last
        if first != -1 and last != -1:
            return compute_allstr(allstr[:first] + compute_str(allstr[first+1:last]) + allstr[last+1:])
        else:
            return compute_str(allstr)
        
    
    #arith_str = "1+2*3-7/2"
    #result = compute_str(arith_str)
    
    arith_str = "1+2*(7-3)/2"
    result = compute_allstr(arith_str)
    
    print result
    

     输出:

    allstr is: 1+2*(7-3)/2
    str is:  7-3
    allstr is: 1+2*4/2
    str is:  1+2*4/2
    str is:  2*4
    str is:  1+8/2
    str is:  8/2
    str is:  1+4
    5

    def oper_two(num_one, oper, num_two):
        if oper == '+':
            return str(int(num_one) + int(num_two))
        if oper == '-':
            return str(int(num_one) - int(num_two))
        if oper == '*':
            return str(int(num_one) * int(num_two))
        if oper == '/':
            if num_two != '0':
                return str(int(num_one) / int(num_two))
        print 'oper_two error!'
    
    #a = oper_two('4', '/', '2')
    #print a
    
    def compute_str(mystr):
        print "str is: " , mystr
        tmp_list = []
        if len(mystr) < 4:
            return oper_two(mystr[0], mystr[1], mystr[2])
        if mystr[1] == '*' or mystr[1] == '/':
            for i in mystr[0:3]:
                tmp_list.append(i)
            for i in mystr[3:]:
                tmp_list.append(i)
            return compute_str(tmp_list)
        elif mystr[3] == '*' or mystr[3] == '/':
            for i in mystr[0:2]:
                tmp_list.append(i)
            tmp_list.append(compute_str(mystr[2:5]))
            for i in mystr[5:]:
                tmp_list.append(i)
            return compute_str(tmp_list)
        else:
            tmp_list.append(compute_str(mystr[:3]))
            for i in mystr[3:]:
                tmp_list.append(i)
            return compute_str(tmp_list)
    
    
    def compute_allstr(allstr):
        print "allstr is:" , allstr
        tmp_list = []
        count = 0
        first = -1
        last = -1
        for i in allstr[:]:
            count += 1
            if i == '(':
                first = count
        count = 0
        for i in allstr[-1::-1]:
            count += 1
            if i == ')':
                last = count
                
        print first , 'and', last
        if first != -1 and last != -1:
            for i in allstr[:first-1]:
                tmp_list.append(i)
            tmp_list.append(compute_str(allstr[first:-last]))
            for i in allstr[-last+1:]:
                tmp_list.append(i)
            return compute_allstr(tmp_list)
        else:
            return compute_str(allstr)
        
    
    #arith_str = "1+2*3-7/2"
    #result = compute_str(arith_str)
    
    
    #arith_str = "1+2*(7-3)/2"
    #result = compute_allstr(arith_str)
    
    def str2list(mystr):
        mylist = []
        one_num = 0
        tmp_i = ''
        for i in mystr:
            if i.isdigit():
                one_num = one_num * 10 + int(i)
            elif i == '(':
                mylist.append(i)
            elif i == ')':
                mylist.append(one_num)
                one_num = 0
                mylist.append(i)
            else:
                if tmp_i != ')':
                    mylist.append(one_num)
                    one_num = 0
                mylist.append(i)
            tmp_i = i
            
        mylist.append(one_num)
        return mylist
    #
    #arith_str = "1+2*17-3/2"
    arith_str = "1+2*(17-3)/2"
    
    arith_list = str2list(arith_str)
    print arith_list
    result = compute_allstr(arith_list)
    
    print result
    

     输出:

    [1, '+', 2, '*', '(', 17, '-', 3, ')', '/', 2]
    allstr is: [1, '+', 2, '*', '(', 17, '-', 3, ')', '/', 2]
    5 and 3
    str is:  [17, '-', 3]
    allstr is: [1, '+', 2, '*', '14', '/', 2]
    -1 and -1
    str is:  [1, '+', 2, '*', '14', '/', 2]
    str is:  [2, '*', '14']
    str is:  [1, '+', '28', '/', 2]
    str is:  ['28', '/', 2]
    str is:  [1, '+', '14']
    15

    使用栈:

  • 相关阅读:
    Cordova原理一
    View 的measure 和onMeasure
    Android Material Design 系列之 SnackBar详解
    android 透明状态栏方法及其适配键盘上推(二)
    android 透明状态栏方法及其适配键盘上推(一)
    Https握手协议以及证书认证
    App对接支付宝移动支付功能
    ViewPager 滑动一半的判断方法以及左滑右滑判断
    mvp架构解析
    解决IE8打开默认弹出开发者工具的问题
  • 原文地址:https://www.cnblogs.com/Jason-Ch/p/3303676.html
Copyright © 2011-2022 走看看