当前位置: 首页 > news >正文

队列(Queue)的详解

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

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

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

2、队列的使用

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

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

以下代码为Queue的代码演示

import java.util.LinkedList;
import java.util.Queue;
//Queue 的演示示例
public class Demo2 {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();

        System.out.println(queue.size());
        System.out.println(queue);

        System.out.println("===============================");
        //出队
        queue.poll();
        System.out.println(queue.peek());
        System.out.println(queue);
        System.out.println("===============================");
//        //删除,没有元素的时候会抛出异常
//        System.out.println(queue.remove());
//        System.out.println(queue);
//        System.out.println(queue);
//        //获取,没有元素的时候会抛出异常
//        System.out.println(queue.element());
//        System.out.println(queue);
    }
    public static void main1(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        //入队
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        queue.offer(5);
        System.out.println(queue.size());
        System.out.println(queue);

        System.out.println("===============================");
        //出队
        queue.poll();
        System.out.println(queue.peek());
        System.out.println(queue);
        System.out.println("===============================");
        //删除
        System.out.println(queue.remove());
        System.out.println(queue);
        System.out.println(queue.remove(5));
        System.out.println(queue);
        //获取
        System.out.println(queue.element());
        System.out.println(queue);
    }
}

3、队列的模拟实现

//用双向链表实现
public class MyQueue {

    private static class ListNode {
        int val;
        ListNode prev;
        ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
    private ListNode head;
    private ListNode tail;
    public int size;
    public void offer (int e){
        ListNode node = new ListNode(e);
        if(head == null) {
            head = node;
        } else {
            tail.next = node;
            node.prev = tail;
        }
        tail = node;
        size++;
    }

    public int poll (){
        if(isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        int headValue = head.val;
        head = head.next;
        if(head == null) {
            tail = null;
        } else {
            head.prev.next = null;
            head.prev = null;
        }
        size--;
        return headValue;
    }

    public int peek(){
        if(isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        return head.val;
    }
    public int size (){
        return -1;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public void display(){
        ListNode cur = head;
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        while(cur != null){
            sb.append(cur.val);
            if(cur.next != null){
                sb.append(",");
            }
            cur = cur.next;
        }
        sb.append("]");
        System.out.println(sb.toString());
    }
}

 4、循环队列

       环形队列通常使用数组实现

注意:

      底层还是一个数组,指定一个队列的大小,入队时,当队列满的时候就不能再放了,出队时当队列为空的时候就不能再出队了 

      加一个冗余位置,当rear = front + 1这时,可以判定队列已满

      改变下标位置:(index + x)% array.length = 正确的下标

以下代码设计循环队列

class MyCircularQueue {

    private int[] elementData;
    private int front;
    private int rear;
    public MyCircularQueue(int k) {
        this.elementData = new int[k + 1];
    }

    //入队
    public boolean enQueue(int value) {
        if(isFull()) {
            return false;
        }
        elementData[rear] = value;
        rear = (rear + 1) % elementData.length;
        return true;
    }

    //出队
    public boolean deQueue() {
        if(isEmpty()) {
            return false;
        }
//        int res = elementData[front];出队的值
        front = (front + 1) % elementData.length;
        return true;
    }

    //取队首元素
    public int Front() {
        if(isEmpty()) {
            return -1;//在oj题不要抛异常,return-1即可
        }
        return elementData[front];
    }

    //取队尾元素
    public int Rear() {
        if(isEmpty()) {
            return -1;
        }
        return elementData[(rear - 1 + elementData.length) % elementData.length];

    }
    
    public boolean isEmpty() {
        return rear == front;
    }

    //判断是否已满
    public boolean isFull() {
        return (rear + 1) % elementData.length == front;
    }
}

5、双端队列(Deque)

     双端队列是指允许两端都可以进行入队和出队的操作的队列,Deque是一个接口,使用时必须创建LinkedList的对象

注意:栈,在Java中是用数组实现的,Stack继承自Vector,性质是后进先出 LIFO

          队列,在Java中是用双向链表实现的,实现类是LinkedList,性质是先进先出 FIFO 

相关文章:

  • 快速发布windows上的web项目【免费内网穿透】
  • 【C++笔试强训】第十一天
  • [Linux打怪升级之路]-vim编辑器(看就能马上操作噢)
  • 睿智的目标检测61——Keras搭建YoloV7目标检测平台
  • DM8: 达梦数据库生成100以内2位数加减法
  • 《数据结构》(六)八大排序(上)
  • 几道简单的Linux驱动相关面试题,你看你会几题?
  • libusb系列-004-Qt下使用libusb库
  • vue的简单学习
  • Arduino基础知识
  • 【入门4】数组——蛇形方阵
  • web自动化测试——入门篇01
  • 探索云原生技术之容器编排引擎-Kubernetes/K8S详解(5)
  • 软考中级(软件设计师)——面向对象程序设计(C++Java二选一的题15分-目标3分)
  • 《JavaSE-第十四章》之文件(一)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular2开发踩坑系列-生产环境编译
  • extjs4学习之配置
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS 系统授权开发
  • Just for fun——迅速写完快速排序
  • SQLServer之索引简介
  • Vue ES6 Jade Scss Webpack Gulp
  • vuex 笔记整理
  • 订阅Forge Viewer所有的事件
  • 技术胖1-4季视频复习— (看视频笔记)
  • 力扣(LeetCode)56
  • 十年未变!安全,谁之责?(下)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 用 Swift 编写面向协议的视图
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​比特币大跌的 2 个原因
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​学习一下,什么是预包装食品?​
  • ![CDATA[ ]] 是什么东东
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (黑马C++)L06 重载与继承
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十)c52学习之旅-定时器实验
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)http协议
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET中 MVC 工厂模式浅析
  • @Autowired多个相同类型bean装配问题