通过不懈的努力终于写好了
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
}