[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())
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
评论