力扣--剑指offer--栈与队列,golang
剑指offer09 两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]示例 2:输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
- -10000 <= Node.val <= 10000
- Node.random 为空(null)或指向链表中的节点。
- 节点数目不超过 1000 。
解析
既然是用两个栈实现队列的插入删除操作
那么维护两个栈,这里命名为栈1和栈2
栈1用来实现队列的插入操作
栈2用来实现队列的删除操作
队列先进先出,栈先进后出,
当插入元素时,我们将元素插入到栈1中,重复的插入,最先被插入的元素在栈1的下面,然后队列是先进先出,如果删除队首元素那么就要删除栈1的底部元素,所以这时我们将栈1的元素一 一取出,并放入栈2,此时元素的顺序和栈1的顺序正好相反,那么实现删除操作时,只用从栈2顶部取出一个元素即可。
type CQueue struct {//申请两个数组,一个栈1--in,一个栈2--outin []intout []int
}//初始化函数
func Constructor() CQueue {return CQueue{make([]int,0,5),make([]int,0,5),}
}//入队操作,只用在栈1中插入即可
func (this *CQueue) AppendTail(value int) {this.in = append(this.in[:],value)
}//删除操作,如果栈2中有元素,那么直接从栈2中取出即可
//如果栈2中没有元素,则将栈1中的元素取出,放入栈2
//如果栈1栈2都为空,返回-1
func (this *CQueue) DeleteHead() int {if len(this.in) == 0 && len(this.out) == 0 {return -1}else if len(this.out) == 0 && len(this.in) > 0 {l := len(this.in) - 1for len(this.in) > 0 {val := this.in[l]this.in = this.in[:l]this.out = append(this.out,val)l --}}n := len(this.out)r := this.out[n-1]this.out = this.out[:n-1]return r
}/*** Your CQueue object will be instantiated and called as such:* obj := Constructor();* obj.AppendTail(value);* param_2 := obj.DeleteHead();*/
剑指offer30 包含main函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
解释一下
就是实现可以找到最小值的栈
额外维护一个min数组即可。
代码
初始化
type MinStack struct {val []intmin []intsize int
}/** initialize your data structure here. */
func Constructor() MinStack {return MinStack{nil,nil,0}
}
push函数
//只需注意min数组
//如果min为空说明目前栈为空,需添加
//如果x小于min的目前最小值,那么也添加
func (this *MinStack) Push(x int) {if this.min == nil || len(this.min) == 0 || x <= this.min[len(this.min) - 1] {this.min = append(this.min, x)}this.val = append(this.val,x)this.size ++
}
pop函数
func (this *MinStack) Pop() {//栈已空无返回值if this == nil || this.size == 0 {return }//当前pop的是栈中最小值,要在min中删除if this.val[this.size - 1] == this.min[len(this.min) - 1] {this.min = this.min[:len(this.min) - 1]}this.val = this.val[:this.size - 1]this.size --
}
min和Top函数
func (this *MinStack) Top() int {if this == nil || this.size == 0 {return math.MaxInt64}return this.val[this.size - 1]
}func (this *MinStack) Min() int {return this.min[len(this.min) - 1]
}
力扣--剑指offer--栈与队列,golang
剑指offer09 两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]示例 2:输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
- -10000 <= Node.val <= 10000
- Node.random 为空(null)或指向链表中的节点。
- 节点数目不超过 1000 。
解析
既然是用两个栈实现队列的插入删除操作
那么维护两个栈,这里命名为栈1和栈2
栈1用来实现队列的插入操作
栈2用来实现队列的删除操作
队列先进先出,栈先进后出,
当插入元素时,我们将元素插入到栈1中,重复的插入,最先被插入的元素在栈1的下面,然后队列是先进先出,如果删除队首元素那么就要删除栈1的底部元素,所以这时我们将栈1的元素一 一取出,并放入栈2,此时元素的顺序和栈1的顺序正好相反,那么实现删除操作时,只用从栈2顶部取出一个元素即可。
type CQueue struct {//申请两个数组,一个栈1--in,一个栈2--outin []intout []int
}//初始化函数
func Constructor() CQueue {return CQueue{make([]int,0,5),make([]int,0,5),}
}//入队操作,只用在栈1中插入即可
func (this *CQueue) AppendTail(value int) {this.in = append(this.in[:],value)
}//删除操作,如果栈2中有元素,那么直接从栈2中取出即可
//如果栈2中没有元素,则将栈1中的元素取出,放入栈2
//如果栈1栈2都为空,返回-1
func (this *CQueue) DeleteHead() int {if len(this.in) == 0 && len(this.out) == 0 {return -1}else if len(this.out) == 0 && len(this.in) > 0 {l := len(this.in) - 1for len(this.in) > 0 {val := this.in[l]this.in = this.in[:l]this.out = append(this.out,val)l --}}n := len(this.out)r := this.out[n-1]this.out = this.out[:n-1]return r
}/*** Your CQueue object will be instantiated and called as such:* obj := Constructor();* obj.AppendTail(value);* param_2 := obj.DeleteHead();*/
剑指offer30 包含main函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
解释一下
就是实现可以找到最小值的栈
额外维护一个min数组即可。
代码
初始化
type MinStack struct {val []intmin []intsize int
}/** initialize your data structure here. */
func Constructor() MinStack {return MinStack{nil,nil,0}
}
push函数
//只需注意min数组
//如果min为空说明目前栈为空,需添加
//如果x小于min的目前最小值,那么也添加
func (this *MinStack) Push(x int) {if this.min == nil || len(this.min) == 0 || x <= this.min[len(this.min) - 1] {this.min = append(this.min, x)}this.val = append(this.val,x)this.size ++
}
pop函数
func (this *MinStack) Pop() {//栈已空无返回值if this == nil || this.size == 0 {return }//当前pop的是栈中最小值,要在min中删除if this.val[this.size - 1] == this.min[len(this.min) - 1] {this.min = this.min[:len(this.min) - 1]}this.val = this.val[:this.size - 1]this.size --
}
min和Top函数
func (this *MinStack) Top() int {if this == nil || this.size == 0 {return math.MaxInt64}return this.val[this.size - 1]
}func (this *MinStack) Min() int {return this.min[len(this.min) - 1]
}