😶一分耕耘,一分收获😶
💪💪💪此系列仅为记录本人补充学习数据结构相关知识,有兴趣的,大家可以共同学习👏👏👏
[= 有效的括号 =]
题目描述
解题思路
1、如果是单数则肯定不是有效括号
2、利用栈的概念,如果当点扩展在栈内,且与最顶端的括号为对应关系,则为有效括号
3、如果没有,则入栈
解题方法
func isValid(s string) bool {
// 单数肯定不是
if len(s)%2 == 1 {
return false
}
// 定义一个括号map
pairs := map[byte]byte{
')': '(',
']': '[',
'}': '{',
}
stack := []byte{}
for i := 0; i < len(s); i++ {
// 判断括号是否存在
if pairs[s[i]] > 0 {
// 判断栈内最上层是否与对应括号对应
if len(stack) == 0 || stack[len(stack)-1] != pairs[s[i]] {
return false
}
// 如果匹配对应括号,则出栈
stack = stack[:len(stack)-1]
} else {
stack = append(stack, s[i])
}
}
// 最后栈的长度如果不等0 则就不是有效扩展
return len(stack) == 0
}
[= 用栈实现队列 =]
题目描述
解题思路
关于栈、队列我们只需记住如下规则即可
栈:先入后出
队列:先入先出
解题方法
type MyQueue struct {
inStack, outStack []int
}
func Constructor() MyQueue {
return MyQueue{}
}
// push(x):将元素 x 推到队列的末尾
func (this *MyQueue) Push(x int) {
this.inStack = append(this.inStack, x)
}
// 将元素从进栈列转移至出栈列
func (this *MyQueue) in2out() {
// 一定注意队列先入先出原则
// 栈后入先出
for len(this.inStack) > 0 {
// 将入栈的第一个元素追加至出栈列中
this.outStack = append(this.outStack, this.inStack[len(this.inStack)-1])
// 删除入栈列中相应元素
this.inStack = this.inStack[:len(this.inStack)-1]
}
}
//pop: 从队列的开头移除并返回元素
func (this *MyQueue) Pop() int {
if len(this.outStack) == 0 {
this.in2out()
}
x := this.outStack[len(this.outStack)-1]
this.outStack = this.outStack[:len(this.outStack)-1]
return x
}
// peek:返回队列开头的元素
func (this *MyQueue) Peek() int {
if len(this.outStack) == 0 {
this.in2out()
}
return this.outStack[len(this.outStack)-1]
}
// empty: 如果队列为空,返回 true ;否则,返回 false
func (this *MyQueue) Empty() bool {
return len(this.inStack) == 0 && len(this.outStack) == 0
}