计算四则表达式值 Golang
思路:
先转逆波兰,再求值
逆波兰求值的思路是,碰到数字入栈,碰到运算符则取栈顶两元素运算后入栈,最终栈内数字即为答案。
中缀表达式转为后缀表达式,即逆波兰表达式方法:对于中缀表达式的每个元素,遇到数字则直接加到结果上面,遇到操作符,若栈空或者当前操作符不小于栈顶操作符优先级(乘除大于加减),则入栈,否则将栈弹空依次加到结果上,再把当前元素入栈。遍历完毕后,最后再将栈内元素依次弹到结果上即可。
package main
import (
"fmt"
"strconv"
"strings"
)
func mid2fix(s string) []string {
res := []string{}
exp := strings.Fields(s)
ss := []string{}
fmt.Println(exp)
for _, c := range exp {
_, err := strconv.Atoi(c)
// 是数字 结果直接加
if err == nil {
res = append(res, c)
} else {
// 不是数字
if len(ss) == 0 {
// 栈空直接入
ss = append(ss, c)
} else {
// 判断优先级是否低于栈顶
lst := ss[len(ss)-1]
if low_prio(c, lst) {
for len(ss) > 0 {
res = append(res, ss[len(ss)-1])
ss = ss[:len(ss)-1]
}
}
ss = append(ss, c)
}
}
}
for len(ss) > 0 {
res = append(res, ss[len(ss)-1])
ss = ss[:len(ss)-1]
}
return res
}
func low_prio(a, b string) bool {
if a == "*" || a == "/" {
return false
} else {
if b == "*" || b == "/" {
return true
} else {
return false
}
}
}
func calc_res(exp []string) int {
s := []int{}
for _, ex := range exp {
num, err := strconv.Atoi(ex)
if err == nil {
s = append(s, num)
} else {
a, b := s[len(s)-2], s[len(s)-1]
s = s[:len(s)-2]
s = append(s, op(a, b, ex))
}
}
return s[0]
}
func op(a, b int, c string) int {
if c == "*" {
return a * b
} else if c == "/" {
return a / b
} else if c == "+" {
return a + b
} else {
return a - b
}
}
func main() {
tt := "2 + 3 * 4 - 5 / 6"
exp := mid2fix(tt)
fmt.Println(exp)
res := calc_res(exp)
fmt.Println(res)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具