力扣--剑指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--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]
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值