文章目录
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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
}