• python计算器


    思路:
    优先级处理
    思路一:正则表达式+递归(计算时间慢)
    思路二:堆栈的方式

    队列:先进先出
    电梯--》队列
    上电梯(入队123):第三个人3,第二个人2,第一个人1
    >>> li = []
    >>> li.insert(0,'p1')#进队列
    >>> li.insert(0,'p2')
    >>> li.insert(0,'p3')
    >>> li
    ['p3', 'p2', 'p1']
    或者用append('元素')
    下电梯(出队123):第一个人,第二个人,第三个人
    >>> li.pop()#出队列
    'p1'
    >>> li.pop()
    'p2'
    >>> li.pop()
    'p3'
    >>>
    如果用append方法,就用li.pop(0)
    堆栈:先进后出
    衣服箱子--》堆栈
    装衣服(入栈123):第三件衣服3,第二件衣服2,第一件衣服1
    >>> li = []
    >>> li.insert(0,'a1')#进栈
    >>> li.insert(0,'a2')
    >>> li.insert(0,'a3')
    >>> li
    ['a3', 'a2', 'a1']
    >>>

    取衣服(出栈321):第三件衣服,第二件衣服,第一件衣服
    >>> li.pop(0)#出栈
    'a3'
    >>> li.pop(0)
    'a2'
    >>> li.pop(0)
    'a1'
    >>>

    数字栈
    运算符栈
    拼接成表达式运算

    实例:
    #!/usr/bin/env python
    #_*_coding:utf-8_*_
    
    import re
    #判断是数字还是符号的函数
    def is_symbo(element):#遍历元素
        res = False#判断运算符
        symbol=['+','-','*','/','(',')']
        if element in symbol:
            res=True
        return res
    
    #exp优先级比较
    def priority(top_sym,wait_sym):
        #print('from the priotry:',top_sym,wait_sym)
        level1=['+','-']
        level2=['*','/']
        level3 = ['(']
        level4 = [')']
        #运算符栈栈顶元素为+-
        if top_sym in level1:
            # if wait_sym in level1:
            #     return '>'
            # elif wait_sym in level2:#top_sym='-' wait_sym='*'
            #     return '<'
            # elif wait_sym in level3:#top_sym='-' wait_sym='('
            #     return '<'
            # elif wait_sym in level4:#top_sym='-' wait_sym=')'
            #     return '>'
            # else:
            #     return '>'
            #优化
            if wait_sym in level2 or wait_sym in level3:
                return '<'
            else:
                return '>'
        # 运算符栈栈顶元素为*/
        elif top_sym in level2:
            # if wait_sym in level1:#top_sym='*' wait_sym='+'
            #     return '>'
            # if wait_sym in level2:#top_sym='*' wait_sym='*'
            #     return '>'
            # elif top_sym in level3:#top_sym='-' wait_sym='('
            #     return '<'
            # elif top_sym in level4:#top_sym='-' wait_sym=')'
            #     return '>'
            # else:
            #     return '>'
    
            #优化
            if wait_sym in level3:
                return '<'
            else:
                return '>'
    
        #运算符栈顶元素为(
        elif top_sym in level3:
            if wait_sym in level4:#右括号)碰到了(,那么左括号应该弹出栈
                return '='
            else:
                return '<'#只要栈顶顶元素为(,等待入栈的元素都应该无条件入栈
        # 运算符栈顶元素为)
    
    
    
    
    #用来计算的,执行计算结果
    def calculate(num1,symbol,num2):
        res=0
        if symbol == '+':
            res=num1+num2
        elif symbol =='-':
            res=num1-num2
        elif symbol =='*':
            res=num1*num2
        elif symbol =='/':
            res=num1/num2
        print('from calculate res is [%s|%s|%s] %s' %(num1,symbol,num2,res))
        return res
    
    #接受一个表达式
    def init_action(expression):
        #print(expression)
        #去掉空格,匹配空格,替换为空,目标是expression,重新赋值给expression
        expression = re.sub(' ','',expression)
        #print(expression)
        init_l = [i for i in re.split('(-d+.*d*)',expression)if i]#提取-数字
        #print('--->',init_l)
        expression_l=[]#格式化列表,初始化为空
        while True:
            if len(init_l) ==0:break#pop完了结束
            exp=init_l.pop(0)#列表左侧弹元素
            #print('==>',exp)#打印列表每个元素
            if len(expression_l) ==0 and re.search('^-d+.*d*$',exp):#-开头,数字结尾,匹配负数
                expression_l.append(exp)
                continue#直接进行下次循环,不分割-1
    
            #判断负数出现的情况
            if len(expression_l) > 0:
                if re.search('[+-*/(]$',expression_l[-1]):
                    expression_l.append(exp)
                    continue#不做切分,-2这步
    
    
            new_l = [i for i in re.split('([+-*/()])',exp) if i]#切分结果
            #print(new_l)
            expression_l+=new_l
            #print(expression_l)
        return expression_l
    
    #主函数
    def main(expression_l):
        #print('from in the main',expression_l)
        number_stack=[]#数字栈
        symbol_stack=[]#运算符栈
        for ele in expression_l:#遍历元素是数字还是运算符
            print('-' * 20)
            print('数字栈', number_stack)
            print('运算符栈', symbol_stack)
            print('待入栈运算符', ele)
    
    
            ret = is_symbo(ele)
            #print(ret)
            if not ret:
                #压入数字栈
                ele=float(ele)
                number_stack.append(ele)
    
            else:
                # 压入运算符栈
                while True:
                    if len(symbol_stack) == 0:
                        symbol_stack.append(ele)
                        break
                    res=priority(symbol_stack[-1],ele)#优先级比较
    
                    if res == '<':
                        symbol_stack.append(ele)
                        break
                    elif res == '=':#右括号碰到左括号的情况
                        symbol_stack.pop()
                        break
                    elif res == '>':
                        symbol = symbol_stack.pop()
                        num2=number_stack.pop()
                        num1=number_stack.pop()
                        number_stack.append(calculate(num1,symbol,num2))
        else:
            symbol = symbol_stack.pop()
            num2 = number_stack.pop()
            num1 = number_stack.pop()
            number_stack.append(calculate(num1, symbol, num2))
    
        return number_stack,symbol_stack
    
    
    if __name__ == '__main__':
        #用户输入表达式
        expression = '-1 - 2 *((-60+30+(-40/5)*(-9-2*-5/30-7/3*99/4*2998+10/-568/14))-(-4*-3)/(16-3*2))+3'
        # expression='(1-2*3)-1-2*((-60+30+(-40/5)*(-9-2*-5/30-7/3*99/4*2998+10*568/14))-(-4*-3)/(16-3*2))+3'
        #expression='-1 -3*( -2+3)'
        #格式化处理,得到一个列表
        expression_l = init_action(expression)#把用户输入的表达式格式化成一个列表的形式
        #print(expression_l)
    
        #分到数字栈,运算符栈
        #主函数,处理格式化后的列表
        jieguo=main(expression_l)#数字栈
        print('最终结果是:%s' % jieguo[0][0])
    

     结果:

    --------------------
    数字栈 []
    运算符栈 []
    待入栈运算符 -1
    --------------------
    数字栈 [-1.0]
    运算符栈 []
    待入栈运算符 -
    --------------------
    数字栈 [-1.0]
    运算符栈 ['-']
    待入栈运算符 2
    --------------------
    数字栈 [-1.0, 2.0]
    运算符栈 ['-']
    待入栈运算符 *
    --------------------
    数字栈 [-1.0, 2.0]
    运算符栈 ['-', '*']
    待入栈运算符 (
    --------------------
    数字栈 [-1.0, 2.0]
    运算符栈 ['-', '*', '(']
    待入栈运算符 (
    --------------------
    数字栈 [-1.0, 2.0]
    运算符栈 ['-', '*', '(', '(']
    待入栈运算符 -60
    --------------------
    数字栈 [-1.0, 2.0, -60.0]
    运算符栈 ['-', '*', '(', '(']
    待入栈运算符 +
    --------------------
    数字栈 [-1.0, 2.0, -60.0]
    运算符栈 ['-', '*', '(', '(', '+']
    待入栈运算符 30
    --------------------
    数字栈 [-1.0, 2.0, -60.0, 30.0]
    运算符栈 ['-', '*', '(', '(', '+']
    待入栈运算符 +
    from calculate res is [-60.0|+|30.0] -30.0
    --------------------
    数字栈 [-1.0, 2.0, -30.0]
    运算符栈 ['-', '*', '(', '(', '+']
    待入栈运算符 (
    --------------------
    数字栈 [-1.0, 2.0, -30.0]
    运算符栈 ['-', '*', '(', '(', '+', '(']
    待入栈运算符 -40
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -40.0]
    运算符栈 ['-', '*', '(', '(', '+', '(']
    待入栈运算符 /
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -40.0]
    运算符栈 ['-', '*', '(', '(', '+', '(', '/']
    待入栈运算符 5
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -40.0, 5.0]
    运算符栈 ['-', '*', '(', '(', '+', '(', '/']
    待入栈运算符 )
    from calculate res is [-40.0|/|5.0] -8.0
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0]
    运算符栈 ['-', '*', '(', '(', '+']
    待入栈运算符 *
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0]
    运算符栈 ['-', '*', '(', '(', '+', '*']
    待入栈运算符 (
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(']
    待入栈运算符 -9
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(']
    待入栈运算符 -
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']
    待入栈运算符 2
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, 2.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']
    待入栈运算符 *
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, 2.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']
    待入栈运算符 -5
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, 2.0, -5.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']
    待入栈运算符 /
    from calculate res is [2.0|*|-5.0] -10.0
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, -10.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']
    待入栈运算符 30
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, -10.0, 30.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']
    待入栈运算符 -
    from calculate res is [-10.0|/|30.0] -0.3333333333333333
    from calculate res is [-9.0|-|-0.3333333333333333] -8.666666666666666
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']
    待入栈运算符 7
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 7.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']
    待入栈运算符 /
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 7.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']
    待入栈运算符 3
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 7.0, 3.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']
    待入栈运算符 *
    from calculate res is [7.0|/|3.0] 2.3333333333333335
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 2.3333333333333335]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']
    待入栈运算符 99
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 2.3333333333333335, 99.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']
    待入栈运算符 /
    from calculate res is [2.3333333333333335|*|99.0] 231.00000000000003
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 231.00000000000003]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']
    待入栈运算符 4
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 231.00000000000003, 4.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']
    待入栈运算符 *
    from calculate res is [231.00000000000003|/|4.0] 57.75000000000001
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 57.75000000000001]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']
    待入栈运算符 2998
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 57.75000000000001, 2998.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']
    待入栈运算符 +
    from calculate res is [57.75000000000001|*|2998.0] 173134.50000000003
    from calculate res is [-8.666666666666666|-|173134.50000000003] -173143.1666666667
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+']
    待入栈运算符 10
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, 10.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+']
    待入栈运算符 /
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, 10.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']
    待入栈运算符 -568
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, 10.0, -568.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']
    待入栈运算符 /
    from calculate res is [10.0|/|-568.0] -0.017605633802816902
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, -0.017605633802816902]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']
    待入栈运算符 14
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, -0.017605633802816902, 14.0]
    运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']
    待入栈运算符 )
    from calculate res is [-0.017605633802816902|/|14.0] -0.0012575452716297787
    from calculate res is [-173143.1666666667|+|-0.0012575452716297787] -173143.16792421197
    --------------------
    数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.16792421197]
    运算符栈 ['-', '*', '(', '(', '+', '*']
    待入栈运算符 )
    from calculate res is [-8.0|*|-173143.16792421197] 1385145.3433936958
    from calculate res is [-30.0|+|1385145.3433936958] 1385115.3433936958
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958]
    运算符栈 ['-', '*', '(']
    待入栈运算符 -
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958]
    运算符栈 ['-', '*', '(', '-']
    待入栈运算符 (
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958]
    运算符栈 ['-', '*', '(', '-', '(']
    待入栈运算符 -4
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, -4.0]
    运算符栈 ['-', '*', '(', '-', '(']
    待入栈运算符 *
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, -4.0]
    运算符栈 ['-', '*', '(', '-', '(', '*']
    待入栈运算符 -3
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, -4.0, -3.0]
    运算符栈 ['-', '*', '(', '-', '(', '*']
    待入栈运算符 )
    from calculate res is [-4.0|*|-3.0] 12.0
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0]
    运算符栈 ['-', '*', '(', '-']
    待入栈运算符 /
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0]
    运算符栈 ['-', '*', '(', '-', '/']
    待入栈运算符 (
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0]
    运算符栈 ['-', '*', '(', '-', '/', '(']
    待入栈运算符 16
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0]
    运算符栈 ['-', '*', '(', '-', '/', '(']
    待入栈运算符 -
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0]
    运算符栈 ['-', '*', '(', '-', '/', '(', '-']
    待入栈运算符 3
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0, 3.0]
    运算符栈 ['-', '*', '(', '-', '/', '(', '-']
    待入栈运算符 *
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0, 3.0]
    运算符栈 ['-', '*', '(', '-', '/', '(', '-', '*']
    待入栈运算符 2
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0, 3.0, 2.0]
    运算符栈 ['-', '*', '(', '-', '/', '(', '-', '*']
    待入栈运算符 )
    from calculate res is [3.0|*|2.0] 6.0
    from calculate res is [16.0|-|6.0] 10.0
    --------------------
    数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 10.0]
    运算符栈 ['-', '*', '(', '-', '/']
    待入栈运算符 )
    from calculate res is [12.0|/|10.0] 1.2
    from calculate res is [1385115.3433936958|-|1.2] 1385114.1433936958
    --------------------
    数字栈 [-1.0, 2.0, 1385114.1433936958]
    运算符栈 ['-', '*']
    待入栈运算符 +
    from calculate res is [2.0|*|1385114.1433936958] 2770228.2867873916
    from calculate res is [-1.0|-|2770228.2867873916] -2770229.2867873916
    --------------------
    数字栈 [-2770229.2867873916]
    运算符栈 ['+']
    待入栈运算符 3
    from calculate res is [-2770229.2867873916|+|3.0] -2770226.2867873916
    最终结果是:-2770226.2867873916
    
  • 相关阅读:
    Influxdb修改数据保留策略
    PPT插件(islide)
    有关 MyEclipse->export runnable jar file选项 launch configuration里面没有可以选择的东西的解决方法
    使用SoapUI发送Post请求
    JSONObject 转换 JSON复杂对象
    SQL按照指定顺序对字段进行排序
    全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)
    如何去maven仓库下载jar包
    maven学习(下)利用Profile构建不同环境的部署包
    maven学习(中)- 私服nexus搭建
  • 原文地址:https://www.cnblogs.com/zhangyux/p/6090215.html
Copyright © 2020-2023  润新知