algorithm - 用递归和堆栈构建计算器,总是用括号'()'得到错误的结果,这是怎么回事
问题描述
leetcode-244
给定一个表示表达式的字符串 s,实现一个基本的计算器来计算它。
s 由数字、'+'、'-'、'('、')'和''组成
我用递归和堆栈构建计算器。但是,括号'()'总是得到错误的结果</p>
我在帮助函数中的代码有什么问题
func calculate(s string) int {
if len(s) == 0 {
return 0
}
return helper(s)
}
func helper(s string) int {
stack := make([]int, 0)
num := 0
sign := '+'
for len(s) > 0 {
c := s[0]
s = s[1:]
fmt.Println("======出栈======", string(c))
if c == '(' {
num = helper(s)
}
if (!isdigit(c) && c != ' ') || len(s) == 0 {
switch sign {
case '-':
// fmt.Println("======减法=======", sign)
stack = append(stack, -num)
case '+':
stack = append(stack, num)
case '*':
pre := stack[len(stack)-1] // top
stack = stack[:len(stack)-1] // pop
stack = append(stack, num*pre)
case '/':
pre := stack[len(stack)-1]
stack = stack[:len(stack)-1]
stack = append(stack, num/pre)
}
if c == ')' {
break
}
sign, _ = utf8.DecodeRune([]byte{c})
// fmt.Println(sign, c)
num = 0
}
if isdigit(c) {
num = num*10 + int(c-'0')
}
}
fmt.Println(stack)
return sum(stack)
}
func main() {
// wrong case as follows
// fmt.Println(calculate("1+(4+5+2) - 3"))
// fmt.Println(calculate("(1+(4+5+2)-3)+(6+8)"))
// fmt.Println(calculate(" ( 5*(4-2)+1-6)/5*2 "))
fmt.Println(calculate(" (12-1) + 12 "))
}
func sum(stack []int) int {
res := 0
for i := 0; i < len(stack); i++ {
res += stack[i]
}
return res
}
func isdigit(char byte) bool {
// char >= 48 && char <= 57
return char >= '0' && char <= '9'
}
解决方案
问题出现在您之前没有保留运算符的引用 (。例如 2-(2+2) 因此,您似乎已正确计算 (2+2) 但未将“-4”推送为堆栈。
推荐阅读
- python - 内部服务器错误,而不是来自 Auth0 的引发 AuthError 响应
- python - 在 Pandas 数据帧上应用 scikit-learn murmurhash3_32
- neo4j - neo4j中如何自动展开子关系
- azure-devops - 仅在其他审阅者未批准时添加分支策略审阅者
- javascript - instascan 扫描仪作为承诺
- python - Python 请求。如何保持登录状态?
- reactjs - 为什么我的 export const 函数没有正确导入?
- css - CSS媒体查询问题
- symfony - 如何在 symfony 中使用与另一个实体具有多对多关系的实体的属性
- c - scanf函数吸收01