1. 程式人生 > 其它 >力扣772 基本計算器III

力扣772 基本計算器III

技術標籤:Go語言leetcodego

通過不懈的努力終於寫好了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 }