题解 | #表达式求值#

表达式求值

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)

全部评论

相关推荐

07-04 21:23
已编辑
东莞城市学院 后端
秋招和春招只收到几个中大厂的笔试,本人比较菜,感觉大厂的笔试太难,算法题不能全部做出来就没过了,但是CVTE和小天才的感觉不是很难,基本上都做出来了,笔试还是挂了。Boss上投了Java后端开发都没有回音,boss上有面试机会都是C#工控软件开发方向的,但是这个方向不太懂,资料又少,面试的表现有点差,现在还是想看看Java这边,面试的时候比较有把握点。想请教一下,这份简历还有什么问题,一直没什么机会,还有什么地方要修改的。
程序员小白条:学历太差,民办和公办,外包还得区分的,这个学历+这个简历,没的办法,除非你有人脉,太难了,这环境,何况你都毕业了,连一段实习都没,肯定没公司会挑选了,没竞争力,开发才招几个人,跟你竞争的可不是二本,三本的人哦,何况你在二本,三本里面也排名不高
投递小天才等公司7个岗位
点赞 评论 收藏
分享
05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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