牛客网: BM49
题目: 支持加减乘及括号运算
思路: 使用栈存储每一层()内的运算结果,初始化默认运算符op='+', 字符串遍历提取连续数字, 遇到符号时停止数字提取, 匹配op进行数学运算,存储在栈中,遇到 '('符号进入下一层递归,遇到')'时求出栈中的所有数字之后进行回溯返回此层计算结果与位置索引index,所有字符串处理完时,返回的结果中取数字即可。
代码:
// go
package main
// import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
type Stack struct {
data []int
}
func (s *Stack) Push(e int) {
s.data = append(s.data, e)
}
func (s *Stack) Pop() int {
d := s.data[len(s.data)-1]
s.data = s.data[:len(s.data)-1]
return d
}
func (s *Stack) IsEmpty() bool {
return len(s.data) == 0
}
func calc(s string, index int) []int {
stack := &Stack{}
num := 0
op := byte('+')
sum := 0
i := index
for ; i < len(s); i++ {
// 获取连续字符组成的数字
if s[i] >= '0' && s[i] <= '9' {
num = num * 10 + int(s[i] - '0')
if i != len(s) - 1 {
continue
}
}
// 进入下一层递归
if s[i] == '(' {
res := calc(s, i + 1)
num = res[0]
i = res[i]
if i != len(s) - 1 {
continue
}
}
// 运算符计算
switch op {
case '+':
stack.Push(num)
break
case '-':
stack.Push(-num)
break
case '*':
stack.Push(stack.Pop()*num)
break
}
// 运算完后置0
num = 0
if s[i] == ')' { // 结束递归回溯
break
} else {
op = s[i] // 继续本层后面的运算
}
}
for !stack.IsEmpty() {
sum += stack.Pop()
}
return []int{sum, i}
}
func solve( s string ) int {
// write code here
res := calc(s, 0)
return res[0]
}