题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

package main

import (
    "fmt"
    "strconv"
)

func isGEPriority(op1 byte, op2 byte) bool {
    // 判断运算符 op1 的优先级是否大于等于 op2
    if op1 == '(' {
        return false
    }

    if (op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/') {
        return false
    }

    return true
}

func operate(stk1 []int, stk2 []byte) ([]int, []byte) {
    // 计算操作,并把结果压入栈中
    a, b := stk1[len(stk1)-2], stk1[len(stk1)-1]
    stk1 = stk1[:len(stk1)-2]

    op := stk2[len(stk2)-1]
    stk2 = stk2[:len(stk2)-1]
    
    var ans int
    if op == '+' {
        ans = a + b
    }
    if op == '-' {
        ans = a - b
    }
    if op == '*' {
        ans = a * b
    }
    if op == '/' {
        ans = a / b
    }

    stk1 = append(stk1, ans)

    return stk1, stk2
}

func calculate(s string) int {
    var stk1 []int
    var stk2 []byte

    // 由于无法区分减号和负号,这里用一个标志位来进行区分
    isOp := false

    for i:=0; i<len(s); i++ {
        if s[i] == '(' {
            stk2 = append(stk2, '(')
        } else if s[i] == ')' {
            for stk2[len(stk2)-1] != '(' {
                stk1, stk2 = operate(stk1, stk2)
            }
            // 弹出左括号
            stk2 = stk2[:len(stk2)-1]
        } else if (isOp) {
            for isGEPriority(stk2[len(stk2)-1], s[i]) {
                stk1, stk2 = operate(stk1, stk2)
            }
            // 操作符入栈
            stk2 = append(stk2, s[i])
            isOp = false
        } else {
            start := i
            if s[i] == '+' || s[i] == '-' {
                i++
            }
            for '0' <= s[i] && s[i] <= '9' {
                i++
            }

            num, _ := strconv.Atoi(s[start:i])
            stk1 = append(stk1, num)

            i--
            isOp = true
        }
    }

    return stk1[len(stk1)-1]
}

func main() {
    var s string

    fmt.Scan(&s)

    s = "(" + s + ")"

    fmt.Println(calculate(s))
}
// 本题输入一行字符串,所以采用:fmt.Scan(&s)

全部评论

相关推荐

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