给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
- 1 <= s.length <= 3 * 10 ^5
- s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
- s 表示一个有效的表达式
例子
输入:s = "1 + 1"
输出:2
输入:s = " 2-1 + 2 "
输出:3
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
解题思路
栈方法
通过栈特性, 后进先出进行处理
例如:
s = "(1+(4+5+2)-3)+(6+8)", 栈数组ops = [], 数字容器 num = "", 符号sign = 1, 结果result = 0
**ops: **依次存储上一次和元素, sign
**num: **用来存当前数字, 多位依次拼接
**result: **存上一次和
**sign: **符号
第1次: "(", ops = [0, 1], result = 0, sign = 1, num = ""
第2次: "1", ops = [0, 1], result = 0, sign = 1, num = "1"
第3次: "+", ops = [0, 1], result = 1, sign = 1, num = ""
第3次: "(", ops = [0, 1], result = 1, sign = 1, num = ""
第4次: "+", ops = [0, 1, 1, 1], result = 0, sign = 1, num = ""
第5次: "4", ops = [0, 1, 1, 1], result = 0, sign = 1, num = "4"
第6次: "+", ops = [0, 1, 1, 1], result = 4, sign = 1, num = ""
第7次: "5", ops = [0, 1, 1, 1], result = 4, sign = 1, num = "5"
第8次: "+", ops = [0, 1, 1, 1], result = 9, sign = 1, num = ""
第9次: "2", ops = [0, 1, 1, 1], result = 9, sign = 1, num = "2"
第10次: ")", ops = [0, 1], result = 12, sign = 1, num = ""
第11次: "-", ops = [0, 1], result = 12, sign = -1, num = ""
第12次: "3", ops = [0, 1], result = 12, sign = -1, num = "3"
第13次: ")", ops = [], result = 9, sign = 1, num = ""
第14次: "+", ops = [], result = 9, sign = 1, num = ""
第15次: "(", ops = [9, 1], result = 0, sign = 1, num = ""
第16次: "6", ops = [9, 1], result = 0, sign = 1, num = "6"
第17次: "+", ops = [9, 1], result = 6, sign = 1, num = ""
第18次: "8", ops = [9, 1], result = 6, sign = 1, num = "8"
第19次: ")", ops = [], result = 23, sign = 1, num = ""
未翻译版
var ops = [Int](), sign = 1, num = "", result = 0
func calculate(_ s: String) -> Int {
let temp = s.replacingOccurrences(of: " ", with: "")
for i in temp {
if i == "(" {
calNum(num)
ops.append(result)
ops.append(sign)
result = 0
sign = 1
}else if i == ")" {
calNum(num)
result *= ops.removeLast()
result += ops.removeLast()
}else if i == "+" {
calNum(num)
sign = 1
}else if i == "-" {
calNum(num)
sign = -1
}else {
num.append(i)
}
}
calNum(num)
return result
}
func calNum(_ i: String) {
let nums = Int(i) ?? 0
result += nums * sign
num = ""
}
翻译版
// 定义栈数组, 正负标识sign, num为数字容器, 结果result
// 栈数组用来储存当前 和/差结果以及符号
var ops = [Int](), sign = 1, num = "", result = 0
func calculate(_ s: String) -> Int {
// 定义temp为去除空字符串之后的s
let temp = s.replacingOccurrences(of: " ", with: "")
// 循环temp
for i in temp {
if i == "(" {
// 如果为"(", 先求和
calNum(num)
// ops存之前的和
ops.append(result)
// 存当前符号 +/-
ops.append(sign)
// 结果置0
result = 0
// sign置1
sign = 1
}else if i == ")" {
// 如果为")", 先求和
calNum(num)
// 乘之前符号
result *= ops.removeLast()
// 加上之前和
result += ops.removeLast()
}else if i == "+" {
// 如果为"+", 先求和
calNum(num)
// sign置1, 正
sign = 1
}else if i == "-" {
// 如果为"-", 先求和
calNum(num)
// sign置-1, 负
sign = -1
}else {
// 如果是数字, num依次拼接i
num.append(i)
}
}
// 循环结束, 求和最后的num
calNum(num)
// 返回结果
return result
}
// 公用方法, 主要用来计算
func calNum(_ i: String) {
let nums = Int(i) ?? 0
result += nums * sign
num = ""
}
题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址
网友评论