前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】队列,你必须知道的内部原理!!!

【数据结构】队列,你必须知道的内部原理!!!

作者头像
用户11288949
发布2024-09-24 13:43:02
1200
发布2024-09-24 13:43:02
举报
文章被收录于专栏:学习

那么正片开始~~~🎬️🎬️🎬️

📚️ 1.什么是对队列

🎥1.1队列概念:

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出

的性质

🎥1.2入队列:

进行插入操作的一端称为队尾(Tail/Rear)

🎥1.3出队列:

进行删除操作的一端称为队头(Head/front)

图片实例:

💡💡💡 总结来说,队列就是像我们平时排队一样,先到先得,第一个人站在队头,最后一 个人站在 队尾,这样是否更形象呢~~~

📚️2.队列方法的底层模拟

这部分是比较重要的一部分~~~

🎥2.1引导:

💬在上述描述中可以看到,队列用数组实现,但是当出队列时,可以看到前面的空间都浪费了,所以小编在这里将用链表进行队列的模拟。

图解如下:

💡💡可以看到,front索引前面的数据出队列后就为空了,导致前面的位置就直接浪费了。

🎥2.2初始化链表:

代码如下:

代码语言:javascript
复制
public class Queue {
    // 双向链表节点
    public static class ListNode{  //定义内部类表示节点
        ListNode next;      
        ListNode prev;
        int value;
        ListNode(int value){
            this.value = value;
        }
    }
    ListNode first; // 队头
    ListNode last; // 队尾
    int size = 0;  //有效数据

💬小编在这里创建了一个双向链表(双向链表博客在这里:http://t.csdnimg.cn/8vB1R)方便一系列操作,并且多初始化了一个变量表示有效数据。

🎥2.3入队列:

代码如下:

代码语言:javascript
复制
public void offer(int e){
        ListNode node=new ListNode(e);
        if(first==null){   //判断链表是否为空
            first= node;
            last=node;
        }else {            //正常插入
            node.prev=last;
            last.next=node;
            node.next=null;
            last=node;
        }
        size++;             //有效数据加一
    }

💬在链接节点时要进行链表是否为空的判断,如果为空,就将头结点和尾巴节点都给插入节点。反之,就直接进行正常的尾插法即可。

🎥2.4出队列:

代码如下:

代码语言:javascript
复制
 public int poll(){
        if(isEmpty()){     //判断是否为空
            System.out.println("队列为空,无法输出数据");
            return -1;
        }
        if(first==last){   //当只有一个节点时
            int ret=first.value;
            first=null;
            last=null;
            size--;
            return ret;
        }                  //正常进行链表的头节点删除
        int ret=first.value;
        first=first.next;
        first.prev=null;
        size--;            //有效数据减一
        return ret;

    }

💬这里还是一样的在出队列时,要判断链表是否为空,在进行头节点的删除。

注意:在判空的前提上还要分多个节点和一个节点的头节点的删除情况。

🎥2.5输出队列头元素:

代码如下:

代码语言:javascript
复制
public int peek(){
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
            return -1;
        }
        return first.value;
    }

💬这里还是要先判断链表的状态,最后返回头节点的域值的数据即可,不用做其他操作,得到值就OK。

🎥2.6队列长度,打印,非空判断:

代码如下:

代码语言:javascript
复制
    public int size() {   //获取队列的长度
        return size;
    }
    
    private boolean isEmpty(){  //判断队列是否为空
       if(first==null){
           return true;
       }
       return false;
    }

    public void display(){    //打印队列
        ListNode cur=first;
        while (cur!=null) {    //遍历链表
            System.out.print(cur.value + " ");
            cur = cur.next;
        }
        System.out.println();  //换行,方便测试
    }

💬这里就相比起来,就比前面的更简单,小编就不再过多赘述。

📚️3.队列的应用

🎬️3.1队列的方法

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

🎬️3.2队列的使用代码:

代码实例:

代码语言:javascript
复制
public static void main(String[] args) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(1);
        q.offer(2);
        q.offer(3);
        q.offer(4);
        q.offer(5);                   // 从队尾入队列
        System.out.println(q.size()); // 获取队列长度
        System.out.println(q.peek()); // 获取队头元素
        q.poll();                     
        System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
        if(q.isEmpty()){              
            System.out.println("队列空");
        }else{
            System.out.println(q.size());
        }
    }

💬这里就类似于方法的调用,这里小编就通过注解来解释咯~~~

📚️4.总结语

💬💬小编通过前几期的链表,顺序表,栈,和本篇的队列学习发现在这些数据结构中的底层代码编译思路几乎一样,都是要熟悉对应数据结构的原理,以及对应条件判断。

通过对底层模拟的实现,可以帮助我们理解对应数据结构方法的使用原理。

🌅🌅🌅还是那句话,多练!哈哈哈~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

下期预告:栈和队列的相关例题解析🌟🌟

😊😊 期待你的关注~~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📚️ 1.什么是对队列
    • 🎥1.1队列概念:
      • 🎥1.2入队列:
        • 🎥1.3出队列:
        • 📚️2.队列方法的底层模拟
          • 🎥2.1引导:
            • 🎥2.2初始化链表:
              • 🎥2.3入队列:
                • 🎥2.4出队列:
                  • 🎥2.5输出队列头元素:
                    • 🎥2.6队列长度,打印,非空判断:
                    • 📚️3.队列的应用
                      • 🎬️3.1队列的方法
                        • 🎬️3.2队列的使用代码:
                        • 📚️4.总结语
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档