写点什么

[Day48]-[递归]- 基本计算器 II

作者:方勇(gopher)
  • 2022 年 5 月 29 日
  • 本文字数:880 字

    阅读完需:约 3 分钟

227. 基本计算器 II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

 

示例 1:

输入:s = "3+2*2"输出:7
复制代码

示例 2:

输入:s = " 3/2 "输出:1
复制代码

示例 3:

输入:s = " 3+5 / 2 "输出:5
复制代码

题解:

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())}
复制代码


用户头像

Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入

我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

评论

发布
暂无评论
[Day48]-[递归]-基本计算器 II_递归_方勇(gopher)_InfoQ写作社区