图书整理II(两个栈实现队列)

目录

贼相似题目:

本题题目:

我们直接看题解吧:

审题目+事例+提示: 

解题分析:

解题思路:

代码实现:

代码补充说明:


力扣题目地址:

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 用于将元素倒序,从而实现删除队首元素。

解题思路:

主要思路,入队栈压入出队栈(为空时),栈元素顺序变成倒序,即在入队栈的栈底元素,变成了出队栈的栈顶元素,便可弹出。

图书整理II(两个栈实现队列)_第1张图片

代码实现:

class CQueue {
    LinkedList A, B;
    public CQueue() {
        A = new LinkedList();     //创建两个链表即栈,A为入队栈,B为出队栈
        B = new LinkedList();
    }
    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;            //入队栈已空则返回-1
        while(!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()等。 

另外因为题目要求用“栈”实现队列,因此无论用什么集合框架,都只能当作“栈”来看待

你可能感兴趣的:(#,栈与队列,剑指offer,算法)