题目

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

思路

队列有两个操作,一个是在队尾添加数据,另一个是在头部取出数据,这两个操作分别用一个栈实现,即一个栈用来存数据,另一个栈用来取数据。
当读取数据时,如果读取的栈没有数据,就将存储数据的栈数据导入到读取数据的栈,这样读取的时间复杂度是O(n),写入的时间复杂度是O(1),空间复杂度是O(n)

go语言实现

type CQueue struct {
    stackIn, stackOut *list.List
}

func Constructor() CQueue {
    return CQueue{
        stackIn: list.New(),
        stackOut: list.New(),
    }
}

func (this *CQueue) AppendTail(value int) {
    this.stackIn.PushBack(value)
}

func (this *CQueue) DeleteHead() int {
    if this.stackOut.Len() == 0 {
        for this.stackIn.Len() > 0 {
            this.stackOut.PushBack(this.stackIn.Remove(this.stackIn.Back()))
        }
    }
    
    if this.stackOut.Len() != 0 {
        return this.stackOut.Remove(this.stackOut.Back()).(int)
    }
    return -1
}