两个栈实现一个队列


用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
在这里插入图片描述

type CQueue struct {

}


func Constructor() CQueue {

}


func (this *CQueue) AppendTail(value int)  {

}


func (this *CQueue) DeleteHead() int {

}

切片模拟双栈

思路
将一个栈当作输入栈,用于压入 appendTail 传入的数据;另一个栈当作输出栈,用于 deleteHead 操作。

每次deleteHead 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。

type CQueue struct {
	in, out []int
}

func Constructor() CQueue {
	return CQueue{}
}

func (this *CQueue) in2out() {
	for len(this.in) > 0 {
		last := len(this.in) - 1
		top := this.in[last]
		this.in = this.in[:last]
		this.out = append(this.out, top)
	}
}

func (this *CQueue) AppendTail(value int) {
	this.in = append(this.in, value)
}

func (this *CQueue) DeleteHead() int {
	if len(this.out) == 0 {
		this.in2out()
	}
    if len(this.out)==0{
        return -1
    }
	last := len(this.out) - 1
	top := this.out[last]
	this.out = this.out[:last]
	return top
}

使用list模拟双栈

本题限制了使用双栈实现队列,切片可以模拟栈,list也可以模拟栈。

type CQueue struct {
	list1, list2 *list.List //list包的List函数,是一个结构体
}

func Constructor() CQueue {
	return CQueue{
		list1: list.New(), //New函数,返回*List对象,即创建链表
		list2: list.New(),
	}
}

func (this *CQueue) AppendTail(value int) {
	this.list1.PushBack(value) //直接插入list1尾部即可
}

func (this *CQueue) DeleteHead() int {
	if this.list2.Len() == 0 { //如果list2为空就把list1的元素全部倒置放入list2中并在list1中删除
		for this.list1.Len() != 0 {
			this.list2.PushBack(this.list1.Remove(this.list1.Back()))
		}
	} //这里看似上下两个if刚好条件是相反的,但是一定不能写为if-else,因为我们要的是顺序执行而不是二选一

	if this.list2.Len() != 0 { //不为空就返回list2的Back并删除
		e := this.list2.Back()
		this.list2.Remove(e)
		return e.Value.(int) //注意V大写,并使用类型断言转为int型
	}
	return -1 //没有则返回默认值-1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值