給你一個(gè)字符串表達(dá)式 s ,請(qǐng)你實(shí)現(xiàn)一個(gè)基本計(jì)算器來(lái)計(jì)算并返回它的值。
- 1 <= s.length <= 3 * 10 ^5
- s 由數(shù)字、'+'、'-'、'('、')'、和 ' ' 組成
- s 表示一個(gè)有效的表達(dá)式
例子
輸入:s = "1 + 1"
輸出:2
輸入:s = " 2-1 + 2 "
輸出:3
輸入:s = "(1+(4+5+2)-3)+(6+8)"
輸出:23
解題思路
棧方法
通過(guò)棧特性, 后進(jìn)先出進(jìn)行處理
例如:
s = "(1+(4+5+2)-3)+(6+8)", 棧數(shù)組ops = [], 數(shù)字容器 num = "", 符號(hào)sign = 1, 結(jié)果result = 0
**ops: **依次存儲(chǔ)上一次和元素, sign
**num: **用來(lái)存當(dāng)前數(shù)字, 多位依次拼接
**result: **存上一次和
**sign: **符號(hào)
第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 = ""
}
翻譯版
// 定義棧數(shù)組, 正負(fù)標(biāo)識(shí)sign, num為數(shù)字容器, 結(jié)果result
// 棧數(shù)組用來(lái)儲(chǔ)存當(dāng)前 和/差結(jié)果以及符號(hào)
var ops = [Int](), sign = 1, num = "", result = 0
func calculate(_ s: String) -> Int {
// 定義temp為去除空字符串之后的s
let temp = s.replacingOccurrences(of: " ", with: "")
// 循環(huán)temp
for i in temp {
if i == "(" {
// 如果為"(", 先求和
calNum(num)
// ops存之前的和
ops.append(result)
// 存當(dāng)前符號(hào) +/-
ops.append(sign)
// 結(jié)果置0
result = 0
// sign置1
sign = 1
}else if i == ")" {
// 如果為")", 先求和
calNum(num)
// 乘之前符號(hào)
result *= ops.removeLast()
// 加上之前和
result += ops.removeLast()
}else if i == "+" {
// 如果為"+", 先求和
calNum(num)
// sign置1, 正
sign = 1
}else if i == "-" {
// 如果為"-", 先求和
calNum(num)
// sign置-1, 負(fù)
sign = -1
}else {
// 如果是數(shù)字, num依次拼接i
num.append(i)
}
}
// 循環(huán)結(jié)束, 求和最后的num
calNum(num)
// 返回結(jié)果
return result
}
// 公用方法, 主要用來(lái)計(jì)算
func calNum(_ i: String) {
let nums = Int(i) ?? 0
result += nums * sign
num = ""
}
題目來(lái)源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址