题解 | #表达式求值#

表达式求值

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]

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

中缀转后缀:

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

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

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

若为*,加入栈中。

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

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

后缀求值

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

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

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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务