美文网首页
运算表达式

运算表达式

作者: Ribosome_He | 来源:发表于2021-10-02 22:20 被阅读0次

    输入算数表达式,识别运算符和括号,并根据优先级进行运算

    #print(eval(input()))
    
    #dataL存放数字,opL存放符号,此函数处理数字计算和出栈。一开始,opL先压进一个左括号
    def yunsuan(dataL,opL):
        result = 0 #运算结果
        num = dataL[-1] #数字栈的栈顶,如果是分母则会出现分母为0的错误
        dataL.pop() #取到栈顶后弹出栈顶
        num2 = dataL[-1] #再取一个栈顶的数字
        dataL.pop() #再弹出
        op = opL[-1] #取到符号栈的栈顶
        opL.pop() #弹出符号栈顶
        #下面判断符号,进行运算
        if op == "+":
            result = num + num2
        elif op == "-":
            result = num2 - num
        elif op == "*":
            result = num * num2
        elif op == "/":
            result = num2 / num
        dataL.append(result) #把运算结果压入栈
        return
    
    #opDangqian是字符串中当前的符号,opL是符号栈,此函数判断符号的优先级,但不做出入栈的操作
    #如果当前符号优先级高于符号栈顶的优先级,则不做运算,符号压入栈,返回False
    #若当前符号优先级等于或低于符号栈顶的优先级,则做运算,符号栈顶出栈,返回True
    def youxianji(opDangqian,opL):
        op = opL[-1] #取到栈顶的符号
        if op == '(' or op == '[' or op == '{':
            #若栈顶是左括号,无法运算,返回False
            return False
        elif (op == '+' or op == '-') and (opDangqian == '*' or opDangqian == '/'):
            #若栈顶是加减,当前是乘除,当前优先高于栈顶,不做运算,把乘除压入栈
            return False
        else:
            return True #其他情况均出栈做运算,返回True
        
    #下面是主操作流程
    l = input()
    l = l + ')' #在字符串最后加右括号,便于尾部操作
    dataL = [] #存放数字
    opL = [] #存放符号
    opL.append('(') #符号栈底加个左括号,便于头部操作
    fuhaoList = ["+","-","*","/",")","}","]"] #枚举数字右侧可能出现的符号,用于取多位数的整数
    nextIsOp = False #标志位,判断下一个字符是否为符号
    i = 0 #下标
    while i < len(l): #最后一位是右括号,忽略
        if l[i] == "(" or l[i] == "[" or l[i] == "{": #判断如是左括号,入栈
            opL.append(l[i])
            i += 1
        elif l[i] == ")" or l[i] == "]" or l[i] == "}": #判断若字符串中是右括号,则判断符号栈顶是否为左括号
            while opL[-1] != "(" and opL[-1] != "[" and opL[-1] != "{": #若栈顶不是左括号,则判断当前右括号和符号栈顶的优先级
                if youxianji(l[i],opL): #判断当前右括号和符号栈顶的优先级,因为while已经判断了栈顶不是左括号,所以这里一定为真
                    yunsuan(dataL,opL) #做运算,之后更新栈顶,while循环判断符号栈顶能否遇到左括号
            opL.pop() #栈顶遇到左括号后while结束,弹出栈顶的左括号,继续判断下一个字符
            i += 1
        elif nextIsOp: #若下一个字符为符号,nextIsOp为true,进行运算,即判断是否为+-*/
            while youxianji(l[i], opL): #优先级为真,则需要运算,直到遇到高优先级的字符
                yunsuan(dataL, opL)
            opL.append(l[i]) #将高优先级的符号入栈
            nextIsOp = False
            i += 1
        else: #这里就是处理数字,没有遇到符号的时候
            j = i 
            if l[j] == "-":
                i+=1
            while l[i] not in fuhaoList:
                i += 1
    
            dataL.append(int(l[j:i])) 
            nextIsOp = True
    print(dataL[0])
            
            
            
        
    

    相关文章

      网友评论

          本文标题:运算表达式

          本文链接:https://www.haomeiwen.com/subject/pggpnltx.html