JAVA队列

目录

[1. 队列(Queue)](#1. 队列(Queue))

[2.1 概念](#2.1 概念)

[2.2 队列的使用](#2.2 队列的使用)

​编辑

​编辑

后入后出

[和栈类似 队列同样有 size() 和 empty()方法](#和栈类似 队列同样有 size() 和 empty()方法)

[2.3 队列模拟实现](#2.3 队列模拟实现)

[3. 出队列](#3. 出队列)


1. 队列 (Queue)

1.1 概念

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

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

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

1.2 队列的使用

在Java中,Queue是个接口,底层是通过链表实现的。

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

1.入队列

java 复制代码
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());
}
}

从中我们看到了先入的进入 队头 ,后入的进入 队尾

2.出队列

java 复制代码
class Test2 {
    public static void main(String[] args) {
        Queue<Integer> q= new LinkedList<>();
        q.offer(1);
        q.offer(2);
        q.offer(3);
        q.offer(4);

        System.out.println("=========入队列=========");
        System.out.println(q.poll());
        System.out.println(q.poll());
        System.out.println(q.poll());
        System.out.println(q.poll());
    }
}

后入后出

java 复制代码
public class TestStudentSpeak {

        public static void main(String[] args) {
            Queue<Integer> q= new LinkedList<>();
            q.offer(1);
            q.offer(2);
            q.offer(3);
            q.offer(4);

            System.out.println("=========出队列=========");
            System.out.println(q.poll());
            System.out.println(q.poll());


            System.out.println("=========获取对头元素========");
            System.out.println(q.peek());
            System.out.println(q.peek());
        }
    }

3.查找队头元素

java 复制代码
public class TestStudentSpeak {


    public static void main(String[] args) {
        Queue<Integer> q= new LinkedList<>();
        q.offer(1);
        q.offer(2);
        q.offer(3);
        q.offer(4);

        System.out.println("=========出队列=========");
        System.out.println(q.poll());
        System.out.println(q.poll());


        System.out.println("=========获取对头元素========");
        System.out.println(q.peek());
        System.out.println(q.peek());  


        System.out.println("======获取队列大小=======");
        System.out.println(q.size());

        System.out.println("=======判断队列是否为空=======");
        if (q.isEmpty()) {
            System.out.println("队列为空!");
        } else {
            System.out.println("队列不为空!");
        }
    }

    }

和栈类似 队列同样有 size() 和 empty()方法

1.3 队列模拟实现

队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有

两种:顺序结构 和 链式结构。

那队列的实现使用顺序结构还是链式结构好?

java 复制代码
public class MyQueue implements IQueue {

    List<Integer> queue;

    public MyQueue() {
        queue= new LinkedList<>();
    }
}

用链表删除头节点的时间复杂度是 O(1)

顺序表 删除头数据的,由于要扭动数据,所以时间复杂度达到了 O(N)

java 复制代码
queue= new LinkedList<>();

所以建议选择链表

1.入队列

java 复制代码
public boolean offer(int val) {


    queue.add(val);

    return true;
}

采用了双向链表的尾插功能

2. 出队列

java 复制代码
 @Override
    public int remove() {
        return queue.remove(0);
    }

采用双向链表 的 头删 功能

java 复制代码
@Override
    public int peek() {
        return queue.get(0);
    }

3.查找

这里利用到 链表 的获取**第一个元素**的功能

java 复制代码
@Override
public int size() {
    return queue.size();
}


public boolean isEmpty() {
    return queue.isEmpty();
}

4.判空和判断大小

利用 链表的 size()isEmpty() 两个方法爱实现我们的队列

java 复制代码
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;
// 入队列---向双向链表位置插入新节点
public void offer(int e){
ListNode newNode = new ListNode(e);
if(first == null){
first = newNode;
// last = newNode;
}else{
last.next = newNode;
newNode.prev = last;
// last = newNode;
}
last = newNode;
int value = 0;
if(first == null){
return null;
}else if(first == last){
last = null;
first = null;
}else{
value = first.value;
first = first.next;
first.prev.next = null;
first.prev = null;
}
--size;
return value;
}
// 获取队头元素---获取链表中第一个节点的值域
public int peek(){
if(first == null){
return null;
}
return first.value;
}
public int size() {
return size;
}
public boolean isEmpty(){
return first == null;
}
}

到这里,竹竹零就要和大家说再见了🍕🍕🍕
如果您觉得有失偏颇请您在评论区指正,如果您觉得不错的话留个好评再走吧!!

您的鼓励就是对我最大的支持! ! !

相关推荐
IT毕设实战小研6 分钟前
基于大数据的二手车数据分析与预测
java·大数据·后端·爬虫·python·算法·课程设计
吠品8 分钟前
OkHttp 多文件上传的一个实现
java·服务器·前端
牛油果子哥q12 分钟前
C++序列式容器深度精讲:vector/list/deque底层实现、扩容原理、迭代器失效、性能对比、工程选型避坑
开发语言·c++·list
lingguangbuzhi13 分钟前
【JAVA教程】java课程java学习编程
java·学习·教程
闻缺陷则喜何志丹17 分钟前
【计算几何 第10章】更多几何数据结构:截窗
数据结构·数学·线段树·计算几何·截窗·优先查找树·区间树
啦啦啦啦啦zzzz17 分钟前
升序链表的定时器
linux·服务器·网络·数据结构·c++·链表
WBluuue18 分钟前
数据结构与算法:带权并查集
数据结构·c++·算法
渡我白衣25 分钟前
Acceptor模块的设计与实现
java·linux·服务器·开发语言·网络·c++·人工智能
沫璃染墨38 分钟前
《从零入门Linux系统篇(二十八):文件篇·一——Linux为什么“万物皆文件”:从C语言文件流到系统调用》
linux·运维·服务器·开发语言·c++·文件
luteres2 小时前
Mybatis+SSM整合笔记
java·开发语言·mybatis