美文网首页
运算表达式

运算表达式

作者: 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])
        
        
        
    

相关文章

  • 微信小程序 - 11.运算(三元表达式、for循环)

    运算 => 表达式 可以在花括号中 加入 表达式 -- "语句" 表达式 : 指的是一些简单 运算 数字运算 字符...

  • python的运算符与表达式

    运算符与表达式 1.关系运算符 关系运算符:​ == != > < >= <=关系运算表达式:​ 格...

  • js笔记之运算符

    一:运算符和表达式 1.三目运算符(三元运算符) 表达式1?:表达式2:表达式3; ...

  • 2018-05-25笔记

    一:运算符和表达式 1.三目运算符(三元运算符) 表达式1?:表达式2:表达式3...

  • 三目运算符,函数,声明提前

    一:运算符和表达式 1.三目运算符(三元运算符) += -= *= /= %= 表达式1?:表达式2:表达式3...

  • C语言6 运算符和表达式

    C语言6 运算符和表达式 运算符与表达式 什么是运算符?什么是表达式? 表达式的结果 表达式不论怎么复杂。最终只有...

  • Python入门-运算符与表达式

    运算符与表达式 算数运算 + - * / % ** // 比较运算 < > <= >= == != 赋值运算...

  • Java 三目运算 if else 一行代码搞定

    java 三目运算符 Java中三目运算符的语法: 表达式1?表达式2:表达式3;运算顺序先计算‘表达式1’的值 ...

  • 条件运算符(三元运算符)

    条件运算符( ? : )也称为 “三元运算符”。 语法形式:布尔表达式 ? 表达式1 :表达式2运算过程:如果布尔...

  • 三元运算符

    三元运算符 元即参与运算的数据。 格式:(条件表达式)?表达式1:表达式2;表达式:通俗的说,即通过使用运算符将操...

网友评论

      本文标题:运算表达式

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