剑指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--out
in []int
out []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) - 1
for 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 []int
min []int
size 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]
}