目录
贼相似题目:
本题题目:
我们直接看题解吧:
审题目+事例+提示:
解题分析:
解题思路:
代码实现:
代码补充说明:
力扣题目地址:
LCR 125. 图书整理 II - 力扣(LeetCode)
剑指offer题目地址:
【剑指Offer】5、用两个栈实现队列 - gzshan - 博客园 (cnblogs.com)
难度:简单
今天刷图书整理II(两个栈实现队列),大家有兴趣可以点上看看题目要求,试着做一下。
贼相似题目:
建议先做这一道,做完会对本题有更好的理解
栈实现队列,力扣-CSDN博客
本题题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
我们直接看题解吧:
审题目+事例+提示:
Tips:力扣的题目说得云里雾里的,建议先看剑指offer,或者先写那道相似题目。
由题意可知,我们可将两个“书车”看作两个“栈”,则本题可被转化为“用两个栈实现一个队列”。即用两个后入先出的栈来实现先入先出的队列。
解题分析:
设有含三个元素的栈 A = [1,2,3] 和空栈 B = [] 。若循环执行 A 元素出栈并添加入栈 B ,直到栈 A 为空,则 A = [] , B = [3,2,1] ,即栈 B 元素为栈 A 元素倒序。
利用栈 B 删除队首元素:倒序后,B 执行出栈则相当于删除了 A 的栈底元素,即对应队首元素。
题目要求实现 加入队尾appendTail() 和 删除队首deleteHead() 两个函数的正常工作。因此,可以设计栈 A 用于加入队尾操作,栈 B 用于将元素倒序,从而实现删除队首元素。
解题思路:
主要思路,入队栈压入出队栈(为空时),栈元素顺序变成倒序,即在入队栈的栈底元素,变成了出队栈的栈顶元素,便可弹出。
代码实现:
class CQueue {LinkedList<Integer> A, B;public CQueue() {A = new LinkedList<Integer>(); //创建两个链表即栈,A为入队栈,B为出队栈B = new LinkedList<Integer>();}public void appendTail(int value) { A.addLast(value); //相应元素先压入入队栈A}public int deleteHead() {if(!B.isEmpty()) return B.removeLast(); //出队栈B进行弹出操作并返回对应值,在A栈空,B未空时,防止直接返回-1,而为返回B栈的元素if(A.isEmpty()) return -1; //入队栈已空则返回-1while(!A.isEmpty())B.addLast(A.removeLast()); //将入队栈的元素依次压入出队栈return B.removeLast(); //出队栈B进行弹出操作,没有return语句会报错}
}
代码补充说明:
注意哈:
Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。
Deque是一个双端队列接口,继承自Queue接口。
· Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。
·Deque堆栈操作方法:push()、pop()、peek()等。
另外因为题目要求用“栈”实现队列,因此无论用什么集合框架,都只能当作“栈”来看待