[Day47]-[递归]- 基本计算器
作者:方勇(gopher)
- 2022 年 5 月 29 日
本文字数:833 字
阅读完需:约 3 分钟
224. 基本计算器
给你一个字符串表达式
s,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如
eval()。
示例 1:
输入:s = "1 + 1"输出:2
复制代码
示例 2:
输入:s = " 2-1 + 2 "输出:3
复制代码
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"输出:23
复制代码
题解:
func TestCalculate(t *testing.T) { var s = "34-(2*2)+1" var helper func() int var sum func(stack []int) int sum = func(stack []int) int { ans := 0 for len(stack) > 0 { ans += stack[0] stack = stack[1:] } return ans } helper = func() int { var stack []int var num int var sign = '+' for len(s) > 0 { // 这里的s是全局的,处理一个字符少一个 c := s[0] // 每次弹出一个字符 s = s[1:] // 弹出字符 if unicode.IsDigit(rune(c)) { // 如果是数字 继续读取 num = num*10 + int(c-'0') // 转成数字 } if c == '(' { // 遇到括号继续递归 num = helper() // 开始递归 } // 遇到符号 或者 循环到结尾 处理上一个符号 if (!unicode.IsDigit(rune(c)) && c != ' ') || len(s) == 0 { switch sign { // sign 为上一个 符号 初始化为+ case '+': stack = append(stack, num) // +num case '-': stack = append(stack, -num) // -num case '*': pre := stack[len(stack)-1] // 栈顶 stack = stack[:len(stack)-1] // 弹出栈 stack = append(stack, pre*num) // 计算'*' case '/': pre := stack[len(stack)-1] // 栈顶 stack = stack[:len(stack)-1] // 弹出栈 stack = append(stack, pre/num) // 计算'/' } sign, num = rune(c), 0 // 归位 符号 和 num } if c == ')' { // 括号递归终止条件 break } } return sum(stack) // 返回结果集 }
t.Log(helper())}复制代码
划线
评论
复制
发布于: 刚刚阅读数: 6
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!










评论