因为Go中没有栈,可以使用切片来作为栈的基础数据结构
我们先了解一下切片
切片
切片(slice)是对数组的一个连续片段的引用。slice[开始位置:结束位置] (
注意:终止索引标识的项不包括在切片内)
1、从数组生成切片
var arr = []int {1,2,3,4,5}//新建一个数组
slice := arr[1:3]
fmt.Println(slice)//[2,3]
//其他范围
arr[:2]//从开头到指定位置
arr[2:]
arr[:]//生成的切片和原数组一致
2、直接声明切片
var name []type
//或用make函数构造
slice := make([]tpye,size,cap)//其中,size指为这个类型分配多少个元素,cap指容量,只是提前分配空间,不影响size
//实例 a :=make([]int,2,10)
栈
新建一个栈
stack := []int { 初始值 }
//或者直接创建一个空栈
stack := []int {}
栈顶元素
stack[len(stack)-1]
入栈
stack = append(stack,1)//将1入栈
出栈
stack = stack[:len(stack)-1]//用于将栈顶元素移除,实现出栈操作
栈长
len(stack)
实例——leetcode 20.括号有效性
func isValid(s string) bool {
//后遇到的左括号要先闭合,所以可以使用栈来解决
//遇到左括号就入栈
//遇到右括号,先判断栈顶元素是否为同类型的左括号,如果是则出栈。所以这里要用hash表来判断是否为同类型
//遍历完字符串s后,所有的左括号应闭合,所以stack应为空栈
n := len(s)
if n%2 == 1 { //如果字符串是奇数直接返回false
return false
}
//建立哈希表,key为左括号,value为右括号
var m = map[byte]byte{
']': '[',
'}': '{',
')': '(',
}
stack := []byte{} //建立一个栈
for i := 0; i < n; i++ { //遍历字符串s
if _, ok := m[s[i]]; ok { //如果hash表里有key值代表遇到右括号
if len(stack) == 0 || stack[len(stack)-1] != m[s[i]] { //判断栈顶元素是否为右括号对应的左括号类型 或者 栈空了则表示多了个右括号
return false
}
stack = stack[:len(stack)-1] //用于将栈顶元素移除,实现出栈操作
} else { //如果遇到左括号
stack = append(stack, s[i]) //入栈
}
}
return len(stack) == 0
}