题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
// 定义操作符与运算函数的映射
var operatorFuncMap = map[string]func(a, b int) int{
"+": func(a, b int) int { return a + b },
"-": func(a, b int) int { return a - b },
"*": func(a, b int) int { return a * b },
}
// 实现计算器逻辑
func solve(expr string) int {
// 用栈存储数字
nums := []int{}
// 用栈存储运算符
ops := []string{}
// 辅助索引和临时结果
index, result := 0, 0
// 遍历表达式字符
for ; index < len(expr); index++ {
// 如果是数字,则解析整数并存入nums栈
if expr[index] >= '0' && expr[index] <= '9' {
num := 0
for ; index < len(expr) && expr[index] >= '0' && expr[index] <= '9'; index++ {
num = num*10 + int(expr[index]-'0')
}
nums = append(nums, num)
index--
// 如果是左括号,则直接存入ops栈
} else if expr[index] == '(' {
ops = append(ops, string(expr[index]))
// 如果是右括号,则连续从nums和ops栈弹出数据进行运算,直到遇到左括号为止
} else if expr[index] == ')' {
for ops[len(ops)-1] != "(" {
result = operatorFuncMap[ops[len(ops)-1]](nums[len(nums)-2], nums[len(nums)-1])
nums = nums[:len(nums)-2]
nums = append(nums, result)
ops = ops[:len(ops)-1]
}
ops = ops[:len(ops)-1]
// 如果是运算符,则从ops栈弹出运算符,进行运算,并将结果和新运算符 push 入栈
} else {
for len(ops) > 0 && precedence(ops[len(ops)-1]) >= precedence(string(expr[index])) {
result = operatorFuncMap[ops[len(ops)-1]](nums[len(nums)-2], nums[len(nums)-1])
nums = nums[:len(nums)-2]
nums = append(nums, result)
ops = ops[:len(ops)-1]
}
ops = append(ops, string(expr[index]))
}
}
// 将栈中剩余元素弹出计算,得到最终结果
for len(ops) > 0 {
result = operatorFuncMap[ops[len(ops)-1]](nums[len(nums)-2], nums[len(nums)-1])
nums = nums[:len(nums)-2]
nums = append(nums, result)
ops = ops[:len(ops)-1]
}
return nums[0]
}
// 定义运算符的优先级
func precedence(op string) int {
if op == "+" || op == "-" {
return 1
} else if op == "*" {
return 2
} else {
return 0
}
}

查看18道真题和解析