【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈

这篇具有很好参考价值的文章主要介绍了【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈

  • 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
  • 博主主页: @是瑶瑶子啦
  • 每日一言🌼: 每一个不曾起舞的日子,都是对生命的辜负。——尼采

一、 模拟实现循环队列

🔗622. 设计循环队列
【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈

  • 👧🏻思路:
    【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈
  • 🍊数据结构:使用数组为数据结构,且采用牺牲一个空间的方法来包装判空和判满的不同。
    • 判空:Q.rear == Q.front
    • 判满:Q.rear.next == Q.front/(rear+1)%size == front(满的时候可以看上图,此时rear指向的空间浪费掉了)

⭐这里就要注意,因为是浪费一个空间来判满的,所以比如我们需要一个容量为k的循环队列,那么实际的物理容量应该设计为k+1个!!!(这题在下面代码有体现,否则只能存k-1个)!

  • 🍊头尾指针含义(重点)

    • font:指向队头元素
    • rear:下一个待插入元素的位置
  • 🦆

  • 🙇🏻‍♀️代码:

class MyCircularQueue {
    
    int[] myCircularQueue;
    int front = 0;
    int rear = 0;
    int size = 0;

    //构造函数,创建一个循环队列
    public MyCircularQueue(int k) {
        this.size = k+1;//!注意,这里需要+1
        this.myCircularQueue = new int[size];
    }
    
    //入队操作
    public boolean enQueue(int value) {
        if (isFull()){
            return false;
        }
        myCircularQueue[rear] = value;
        rear = (rear+1)%size;
        return true;
    }
    //出队操作
    public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        front = (front + 1)%size;
        return true;
    }
    //读取队头元素(注意判空)
    public int Front() {
       if(isEmpty()){
           return -1;
       }
       return myCircularQueue[front];
    }
    //读取队尾元素(注意判空)
    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        return myCircularQueue[(rear - 1 + size) % size ];
    }
    //判空
    public boolean isEmpty() {
        if(front == rear){
            return true;
        }
        return false;
    }
    //判满
    public boolean isFull() {
        if((rear+1)%size == front){
            return true;
        }
        return false;
    }
}

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * MyCircularQueue obj = new MyCircularQueue(k);
 * boolean param_1 = obj.enQueue(value);
 * boolean param_2 = obj.deQueue();
 * int param_3 = obj.Front();
 * int param_4 = obj.Rear();
 * boolean param_5 = obj.isEmpty();
 * boolean param_6 = obj.isFull();
 */

二、用栈实现队列⭐

🔗232. 用栈实现队列
【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈

  • 👧🏻思路:
    • 若只有一个栈stack1,是不可能实现队列的,它可以实现在“队尾”入队,但不能实现拿到队头元素
      【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈
    • 于是我们需要一个辅助的中转栈stack2, 把stack1的元素依次放入,再通过stack2.peek,间接取得队头元素
      【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈
      此时两个栈一起便实现了队列。(注意,当stack2为空时,及时把stack1的元素挪过去!)
      【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈
  • 🙇🏻‍♀️代码:
class MyQueue {
   Stack<Integer> stack1;
   Stack<Integer> stack2 ;
    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
     /** 添加元素到队尾 */
    public void push(int x) {
        stack1.push(x);
    }
    /** 将stack1的元素挪到stack2 */
    public void stack1ToStack2(){
        while(!stack1.empty()){
            stack2.push(stack1.pop());
        }
    }
     /** 删除队头的元素并返回 */
    public int pop() {
       if(stack2.empty()){
           stack1ToStack2();
       }
       return stack2.pop();
    }
     /** 返回队头元素 */
    public int peek() {
        if(stack2.empty()){
           stack1ToStack2();
       }
       return stack2.peek();
    }
      /** 判断队列是否为空 */
    public boolean empty() {
       return stack1.empty() && stack2.empty();
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

三、225. 用队列实现栈

🔗225. 用队列实现栈

【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈

  • 👧🏻思路:
    • 一个队列实现栈的问题在于:可以像栈一样正常入栈,但是队列的话只能拿到栈底元素,无法拿到栈顶(队尾)元素。
    • 为了解决这个问题,关键是,如何在正常入栈操作的基础上,让新添加元素(即栈顶元素处于队头位置,这才可以始得每次出队列(出栈)拿到的是最新添加的栈顶元素。
  • 方法1:单个队列实现
    即每次加入新元素后,把新元素前面的元素顺次弹出,排到该元素后面,即可让新元素成为队头元素,即栈顶元素。这样就保证队头元素为栈顶元素。
    【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈
  • 🙇🏻‍♀️代码:
class MyStack {
    Queue<Integer> queue;

    public MyStack() {
        queue = new LinkedList<>();
    }
    
    public void push(int x) {
        //先直接添加
        queue.offer(x);
        //将新元素(栈顶元素)前的所有元素顺次移到栈顶元素之后
        for (int i = 0; i < queue.size() - 1; i++){
            queue.offer(queue.poll());
        }
    }
    
    public int pop() {
        return queue.poll();
    }
    
    public int top() {
        return queue.peek();
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */
  • 方法2:双队列实现
    本质和单队列是一样的,实现栈的队列是queue1,只不过在添加新元素之前,把新元素放在空的辅助队列queue2中——使之处于队头(栈顶),然后将queue1中的元素顺次移入,此时再把queue1queue2互换即可(脱裤子放屁的感觉,和方法一基本上是一样的)
class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack() {
        queue1 = new LinkedList<Integer>();
        queue2 = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    
    public int pop() {
        return queue1.poll();
    }
    
    public int top() {
        return queue1.peek();
    }
    
    public boolean empty() {
        return queue1.isEmpty();
    }
}

💐若有疑问的地方,欢迎随时在评论区or私信找瑶瑶子交流讨论🌺

【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈,数据结构|刷题专栏,数据结构,java,数据库,算法,队列,栈

  • Java岛冒险记【从小白到大佬之路】

  • LeetCode每日一题–进击大厂

  • Go语言核心编程

  • 算法文章来源地址https://www.toymoban.com/news/detail-681798.html

到了这里,关于【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)

    目录 队列的概念 队列的数据结构 队列的实现 入队 出队 获取队头元素 获取队列长度 循环队列的概念 循环队列的数据结构 循环队列的实现 判断队列是否为空 判断队列是否已满 入队 出队 得到队头元素 得到队尾元素 队列(Queue)是一种数据结构,是一种 先进先出 (First-

    2024年02月04日
    浏览(38)
  • 数据结构—循环队列(环形队列)

    循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且 队尾被连接在队首之后以形成一个循环 。它也被称为“ 环形缓冲器 ”。 循环队列的一个好处是可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素

    2024年02月11日
    浏览(39)
  • 数据结构--队列与循环队列

            队列是什么,先联想一下队,排队先来的人排前面先出,后来的人排后面后出;队列的性质也一样,先进队列的数据先出,后进队列的后出;就像图一的样子:  图1         如图1,1号元素是最先进的,开始出队时,那么他就是最先出的,然后12进队,就应该排在最

    2024年02月10日
    浏览(42)
  • 【数据结构和算法】--队列的特殊结构-循环队列

    循环队列是队列的一种特殊结构,它的 长度是固定的 k ,同样是 先进先出 ,理论结构是 首尾相连的环形循环结构 。其理论结构大致如下: 具体结构描述可以参考 LeetCode : 622. 设计循环队列的题目要求,大致如下: 设计你的循环队列实现。 循环队列是一种 线性数据结构 ,

    2024年02月04日
    浏览(49)
  • 数据结构之队列(源代码➕图解➕习题)

            在学过栈之后,会了解到栈的底层是根据顺序表或者链表来构建的,那么我们今天要学习的队列是否也是基于顺序表和链表呢?那我们直接进入正题吧!         还是跟上节一样,依旧用图解的方式让大家更好的理解概念。         队列: 队列指的是图中黑色边框

    2024年02月06日
    浏览(39)
  • 数据结构:循环队列的实现(leetcode622.设计循环队列)

      目录 一.循环队列简单介绍 二.用静态数组实现循环队列 1.数组循环队列结构设计 2.数组循环队列的堆区内存申请接口  3.数据出队和入队的接口实现 4.其他操作接口 5.数组循环队列的实现代码总览  三.静态单向循环链表实现循环队列  1.链表循环队列的结构设计 2.创建静态

    2024年02月03日
    浏览(45)
  • 【数据结构】循环队列

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月12日
    浏览(43)
  • 数据结构--循环队列、链队

    //循环队列数据结构 typedef struct { QElemType data[MaxQSize];//数据域 int front,rear; //队头队尾指针 }SqQueue; //链队结点数据结构 typedef struct QNode { int data;//数据域 struct QNode* next;//指针域 }QNode, * QueuePtr; typedef struct { struct QNode* front, * rear;//rear指针指向队尾 用于入队 front指针指向队头 用于

    2024年02月15日
    浏览(42)
  • 数据结构——循环队列的实现

    hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥 个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信

    2024年03月24日
    浏览(41)
  • 九、数据结构——顺序队列中的循环队列

    一、循环队列的定义 二、循环队列的实现 三、循环队列的基本操作 ①初始化 ②判空 ③判满 ④入队 ⑤出队 ⑥获取长度 ⑦打印 四、循环队列的应用 五、全部代码 在数据结构中,队列(Queue)是一种常见的线性数据结构,遵循先进先出(First In First Out,FIFO)的原则。循环队

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包