力扣772 基本計算器III
阿新 • • 發佈:2021-02-20
通過不懈的努力終於寫好了
Golang
的語言的程式碼~
其實本來還是可以寫的很簡單的,但是為了加強棧在go語言中的操作,還是用stack進行了編寫
題目如下:
實現一個基本的計算器來計算簡單的表示式字串。
表示式字串只包含非負整數和+, -, *, / 操作符,左括號 ( ,右括號 )和空格 。整數除法需要向下截斷。
你可以假定給定的字串總是有效的。所有的中間結果的範圍為 [-2147483648, 2147483647]。
進階:你可以在不使用內建庫函式的情況下解決此問題嗎?
示例 1:
輸入:s = “1 + 1”
輸出:2
示例 2:
輸入:s = “2 * (5+5*2)/3+(6/2+8)”
輸出:21
基本思路
- 主要的思路還是來自於LeetCode224和LeetCode227
- 關於四則運算:主要是將其全部轉化為加法(乘法和除法經過計算後,將結果壓入棧中)
- 關於括號的問題:碰到左括號
(
,將其前面的符號壓入棧中;遇到右括號)
,計算對應左括號內形成的所有表示式的值
// @author:來瓶安慕嘻
// @time:2021-02-18 23:38:25
// @file:力扣772 基本計算器III.go
// @開始美好的一天吧 ('μ')
package main
import (
"container/list"
"fmt"
)
func calculate3 (s string) int{
stack := list.New()
var sign byte
sign = '+'
operant := 0
for i:=0;i<len(s);i++{
if s[i]==' '{
continue
}else if s[i]>='0' && s[i]<='9'{
operant = operant*10+int(s[i]-'0')
}else if s[i] == '('{
stack.PushBack(sign)
sign = '+'
}else{
//fmt.Printf("遇到了%v,傳入的運算元為:%v,傳入的操作符為:%v",string(s[i]),operant,string(sign))
res := solve(operant,sign,stack)
//fmt.Printf("計算得到的結果為:%v \n",res)
operant = 0
if s[i] == ')' {
for stack.Back().Value!= byte('+') && stack.Back().Value != byte('-') &&
stack.Back().Value != byte('*') && stack.Back().Value != byte('/'){
res = res + stack.Remove(stack.Back()).(int)
}
sign = stack.Remove(stack.Back()).(byte)
operant = solve(res, sign, stack)
sign = '+'
}else{
stack.PushBack(res)
sign = s[i]
}
}
}
last := solve(operant,sign,stack)
stack.PushBack(last)
result := 0
for i := stack.Front(); i != nil; i = i.Next() {
result = result+i.Value.(int)
}
return result
}
func solve(operant int,sign byte,stack *list.List)int{
if sign == '+'{
return operant
}else if sign=='-'{
return -operant
}else if sign == '*'{
return stack.Remove(stack.Back()).(int)*operant
}else{
return stack.Remove(stack.Back()).(int)/operant
}
}
func main() {
fmt.Println(calculate3("2 * (5+5*2)/3+(6/2+8)")) // 21
}