队列的基本概念以及模拟使用

1.队列的概念:

只允许在一端进行插入数据操作,在另一端进行删除数据操作的线性表,队列具有先进先出FIFO 入队列 :进行插入操作的一端称为队尾.

出队列:进行删除操作的一端称为队头。

图例如下:

2.Queue是一个接口,底层是通过链表实现的

2.队列对应的一些方法:

3.模拟队列的实现:

底层以双向链表为例:

其结构和双向链表类似,包括:前驱指针,后驱指针,数据域

构造方法:数据域的传入。

队头、队尾、以及有效元素个数的定义。

具体代码如下:

java 复制代码
public class MyQueue {
    //双向链表创建队列
    public static class ListNode{
      public ListNode next; //前驱节点
       public  ListNode prev; //后驱节点
        public int val;

        ListNode(int val)
        {
            this.val = val;
        }
    }
       public ListNode first = null; // (队头)头节点
       public ListNode last = null; //(队尾)尾节点
       public int usedSize = 0; //有效元素

3.1:offer(入队列)功能的实现:

创建一个新节点node来接受val的值

在尾插之前,判断链表是否为空(第一次插入,有效元素为0)如果是第一次插入,则队头队尾均为node。

若不是第一次插入,进行尾插操作:

具体代码如下:

java 复制代码
 public void offer(int val){
         ListNode node = new ListNode(val);
         if(isEmpty()){
             first = last = node;
         }else{
             last.next = node;
             node.prev = last;
             last = last.next;
         }
         usedSize++;

     }

 public boolean isEmpty(){
         return usedSize == 0;  (有效元素为零,返回false,继续执行 否则为true,退出)
              }
}

3.2 出队列功能的实现:

  1. 出栈操作 :当调用出栈方法时,你首先需要检查队列是否为空(即 first 是否为 null)。如果队列不为空,你将执行出栈操作。

  2. 移动头节点 :在将 first 指向下一个节点后,新的 first 可能为 null,这表示队列已经为空。

  3. 更新前驱指针

    • 如果 first 不为空 :这意味着队列仍然有元素。在这种情况下,新的 firstprev 应该被设置为 null,以表示它是新的队头节点。
    • 如果 first 为空 :这意味着所有节点都已经被移除,因此就不需要更新 first.prev。此时,last 也应被设置为 null,表示队列已经完全空了。
  4. 具体代码如下:

    java 复制代码
    public int poll() {
        if (first == null) { // 检查队列是否为空
            return null;     // 如果为空,返回 null
        }
        int value = first.val; // 获取队头元素
        first = first.next;    // 移动头节点
        if (first != null) {   // 如果队列不为空,更新头节点的前驱
            first.prev = null; // 将新队头节点的前驱设置为 null
        } else {               // 如果队列为空,更新尾节点
            last = null;       // 更新尾节点为 null
        }
        usedSize--;
        return value;         // 返回出队的值
    }

3.2:peek(获取队头元素的实现:)

判断队列是否为空,如果为空,返回-1,否则返回first队头的值

具体代码如下:

java 复制代码
   public int peek(){
            //获取栈顶元素
                  if(isEmpty()){
                      return -1; //链表为空
                  }
                  return first.val;
              }
              public boolean isEmpty(){
         return usedSize == 0;
              }

今天的分享就到这里,喜欢的老铁来个三联吧!

相关推荐
我命由我123453 分钟前
Android 控件 - CardView(快速实现圆角)
android·java·java-ee·kotlin·android studio·android-studio·android runtime
2601_963869957 分钟前
【计算机毕业设计】基于Java的潮牌购物网站系统的设计与实现
java·开发语言·课程设计
203号居民14 分钟前
LeetCode hot 100 —560. 和为 K 的子数组
java·算法·leetcode
Doraemomo16 分钟前
数据结构-双向链表与多文件工程整合之makefile基础
数据结构·链表
名字还没想好☜32 分钟前
Go 的 io.Reader/Writer 组合实战:io.Copy、TeeReader、MultiWriter 优雅处理数据流
开发语言·后端·golang·go·iphone
浪客川32 分钟前
使用 IDEA 生成API文档
java·ide·intellij-idea
郝学胜-神的一滴44 分钟前
Qt 高级编程 042:进度条从入门到自定义美化
开发语言·c++·qt·软件开发·用户界面
鸿芯微控科技1 小时前
压电纳米定位分辨率怎么测?噪声、带宽、最小可检测位移与Python分析
开发语言·python·噪声分析·压电执行器·纳米定位·位移测量
上下求索,莫负韶华1 小时前
笔记-数据库事务和java事务和切面
java·数据库·笔记
@小匠1 小时前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端