题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回表达式的值
# @param s string字符串 待计算的表达式
# @return int整型
#
class Solution:
    def solve(self , s: str) -> int:
        # write code here
        # 转后缀
        pos=[]
        pos_sta=[]
        i=0
        while i<len(s):
            if s[i]=='+' or s[i]=='-':
                while pos_sta and pos_sta[-1] in ['*','+','-']:
                    pos.append(pos_sta.pop())
                pos_sta.append(s[i])
            elif s[i]=='*':
                pos_sta.append(s[i])
            elif s[i]=='(':
                pos_sta.append(s[i])
            elif s[i]==')':
                while pos_sta:
                    if pos_sta[-1]=='(':
                        pos_sta.pop()
                        break
                    pos.append(pos_sta.pop())
            else: # 数字
                tmp=''
                while i<len(s) and s[i] not in ['+','-','*','(',')']:
                    tmp+=s[i]
                    i+=1
                pos.append(tmp)
                i-=1
            i+=1
        while pos_sta:
            pos.append(pos_sta.pop())
        print(f"pos:{pos}")
        i=0
        sta=[]
        while i<len(pos):
            if pos[i] not in ['+','-','*']:
                sta.append(int(pos[i]))
            else:
                num2=sta.pop()
                num1=sta.pop()
                if pos[i]=='+':
                    sta.append(num1+num2)
                elif pos[i]=='-':
                    sta.append(num1-num2)
                else:
                    sta.append(num1*num2)
            i+=1
        return sta[0]

中缀表达式求值,先转后缀表达式,再用后缀表达式求值。

中缀转后缀:

用到一个栈由于当前运算符只有+-*括号,而括号单独处理,*比+-的优先级高。

遍历中缀表达式,遇到数字时,加入后缀表达式中,遇到符号,要把连续的数字字符变为一个数。

若为+-,判断栈顶是否为+-*,是的话弹出,只到看到(,然后加入栈中。

若为*,加入栈中。

若为),一直弹出,只到弹出(。

弹出的符号除了括号外需要加入后缀表达式。

后缀求值

用到一个新的栈,遍历后缀表达式,若是数字,加入栈

若是符号,弹出栈顶的两个元素,运算后压入栈中,栈顶元素在后,第二个元素在前。

最终结果为栈中剩下的唯一元素

全部评论

相关推荐

2025年10月3日中午,在写完定时一年后发给自己的信之后,敲下键盘,写下这篇文字。我把标题的“所有人”加了引号,因为如我们所见,确实有的人顺风顺水,每天过的很开心,或是早早进入大厂,或是年纪轻轻就拿到了高薪offer,或是过着可能我努力十年也不一定实现的生活。但也许,不是每个人的痛苦都能被别人看到的,这个月我经常会哭,被骗6000块钱、手上钱不够导致拖欠房租、生活还要借朋友钱、国庆长假也没有钱去旅游,互联网公司不稳定担心试用期不过(毕竟上段实习就是被裁了,一有点风吹草动就害怕),但这样的我,不是所有人都知道的,居然是有些朋友的羡慕对象。回忆我的七年“长跑”别人都是多年幸福的恋爱长跑,我没有恋...
故事和酒66:让每一颗种子找到合适自己的生长方式,最终绽放出独一无二的花朵,这远比所有人都被迫长成同一棵“参天大树”的世界,更加美好和富有生机。这是社会和环境的问题,而不是我们的问题。然而就是在这样的环境中,楼主依然能突破自我,逆势成长,其中的艰辛可想而知。这一路的苦难终究会化作你成长的养料
你小时候最想从事什么职业
点赞 评论 收藏
分享
Clavoss:一眼AI,死亏
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务