龙空技术网

经典算法题:用两个栈实现队列

加班狗的微博 77

前言:

如今咱们对“栈的经典例题”大概比较讲究,兄弟们都想要学习一些“栈的经典例题”的相关文章。那么小编同时在网上网罗了一些对于“栈的经典例题””的相关知识,希望大家能喜欢,大家快快来了解一下吧!

题目

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

思路

维护两个栈,第一个栈存储元素,第二个栈用于辅助操作。

根据栈的特性,第一个栈的底部元素是最后插入的元素(appendTail),顶部元素是下一个被删除的元素(deleteHead)。为了维护队列的特性,每次插入的元素应该在第一个栈的底部。因此每次插入元素时,若第一个栈内已经有元素,应将已有的全部元素依次弹出并压入第二个栈,然后将新元素压入第一个栈,最后将第二个栈内的全部元素依次弹出并压入第一个栈。经过上述操作,新插入的元素在第一个栈的底部,第一个栈内的其余元素的顺序和插入元素之前保持一致。

删除元素时,若第一个栈非空,则直接从第一个栈内弹出一个元素并返回,若第一个栈为空,则返回 -1。

另外维护队列的元素个数,用于判断队列是否为空。初始元素个数为 0。每次插入元素,元素个数加 1。每次删除元素,元素个数减 1。

实现

class CQueue {    Stack<Integer> stack1;    Stack<Integer> stack2;    int size;    public CQueue() {        stack1 = new Stack<Integer>();        stack2 = new Stack<Integer>();        size = 0;    }        public void appendTail(int value) {        while (!stack1.isEmpty()) {            stack2.push(stack1.pop());        }        stack1.push(value);        while (!stack2.isEmpty()) {            stack1.push(stack2.pop());        }        size++;    }        public int deleteHead() {        if (size == 0) {            return -1;        }        size--;        return stack1.pop();    }}

标签: #栈的经典例题