首页 > 解决方案 > 用递归和堆栈构建计算器,总是用括号'()'得到错误的结果,这是怎么回事

问题描述

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'
}

标签: algorithmgocalculator

解决方案


问题出现在您之前没有保留运算符的引用 (。例如 2-(2+2) 因此,您似乎已正确计算 (2+2) 但未将“-4”推送为堆栈。


推荐阅读