IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【每日学算法——Day02】队列 -> 正文阅读

[数据结构与算法]【每日学算法——Day02】队列

1. 数组模拟队列

  1. 队列本身是有序列表,具有先入先出的特性,可以使用数组或链表来实现。

  2. 基础构成:

    1. maxSize:数组的最大容量,按照约定空出一个容量,最多能存如maxSize - 1个数据。
    2. front:队列头索引,初始为-1,指向队列头一个数据。
    3. rear:队列尾,初始为-1,指向队列尾最后一个数据。
  3. 特殊场景:

    1. 队列已满: rear = maxSize - 1
    2. 队列已空: rear = front
  4. 基础操作:

    1. 加入数据:(rear < maxSize - 1) rear++; arr[rear] = n
    2. 取出数据:(rear > front) front++; return arr[front]
  5. 模拟实现

    import com.sun.java.accessibility.util.EventID;
    
    /**
     * <Description> Queue<br>
     *
     * @author MitsuiYe<br>
     * @version 1.0<br>
     * @taskId <br>
     * @CreateDate 2021/12/4 23:00
     */
    public class Queue {
        /**
         * 队列的最大容量
         */
        private int maxSize;
    
        /**
         * 队列头
         */
        private int front;
    
        /**
         * 队列尾
         */
        private int rear;
    
        /**
         * 数据存储,模拟队列
         */
        private int[] arr;
    
        /**
         * 构造函数
         * @param maxSize 最大容量
         */
        public Queue(int maxSize) {
            this.maxSize = maxSize;
            arr = new int[maxSize];
    
            // 初始化rear, front
            rear = -1;
            front = -1;
        }
    
        /**
         * 队列内添加数据
         * @param num 数字
         */
        public void add(int num) {
            if (isFull()) {
                throw new RuntimeException("Queue is full");
            }
            arr[++rear] = num;
        }
    
        /**
         * 从队列中取出数据
         * @return 取出的数据
         */
        public int push() {
            if (isEmpty()) {
                throw new RuntimeException("Queue is empty");
            }
            return arr[++front];
        }
    
        /**
         * 队列是否为空
         */
        public boolean isEmpty() {
            return front == rear;
        }
    
        /**
         * 队列是否满
         */
        public boolean isFull() {
            return rear == maxSize - 1;
        }
    }
    
  6. 问题点: 数组不可复用, 只能使用一次(解决方案: 通过%取模构建环形队列, 复用数组)

2. 环形队列

  1. 基本构造

    1. front:指向队列第一个元素,但是初始值为0
    2. rear:指向队列最后一个元素的后一个位置,初始值为0
    3. 队列已满:(rear + 1)% maxSize == front
    4. 队列为空:rear == front
    5. 队列的有效个数:(rear + maxSize - front)% maxSize
    6. 为了区分空和满的情况,环形队列默认空出一个位置
  2. 基础操作

    1. 加入数据:arr[rear] = n, rear = (rear + 1) % maxSize

    2. 取出数据:

      1. 临时变量保存arr[front]
      2. front = (front + 1)% maxSize
      3. 返回临时变量
    3. 显示所有

      int i = front,i < 有效个数 + front, i++)
      arr[i % maxSize]
      
  3. 代码实现

    /**
     * <Description> CircleQueue<br>
     *
     * @author MitsuiYe<br>
     * @version 1.0<br>
     * @taskId <br>
     * @CreateDate 2021/12/7 23:38
     * @see PACKAGE_NAME <br>
     */
    public class CircleQueue {
    
        /**
         * 数组最大容量,队列可使用的为maxSize - 1
         */
        private int maxSize;
    
        /**
         * 队列头, 指向队列第一个元素,初始值取0
         */
        private int front;
    
        /**
         * 队列尾, 指向队列最后一个元素后一位,初始值取0
         */
        private int rear;
    
        /**
         * 数组
         */
        private int[] arr;
    
        public CircleQueue(int maxSize) {
            this.maxSize = maxSize;
            arr = new int[maxSize];
        }
    
        /**
         * 存入数据
         */
        public void add(int num) {
            if (isFull()) {
                throw new RuntimeException("Queue is full!");
            }
            arr[rear] = num;
            rear = (rear + 1) % maxSize;
        }
    
        /**
         * 取出数据
         */
        public int push() {
            if (isEmpty()) {
                throw new RuntimeException("Queue is empty!");
            }
            int num = arr[front];
            front = (front + 1) % maxSize;
            return num;
        }
    
        /**
         * 展示所有数据
         */
        public void show() {
            if (isEmpty()) {
                return;
            }
            for (int i = front; i < front + size(); i++) {
                System.out.println(arr[i % maxSize]);
            }
        }
    
        /**
         * 队列长度
         */
        public int size() {
            return (rear + maxSize - front) % maxSize;
        }
    
        /**
         * 是否为空
         */
        private boolean isEmpty() {
            return front == rear;
        }
    
        /**
         * 是否为满
         */
        private boolean isFull() {
            return (rear + 1) % maxSize == front;
        }
    }
    
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 14:04:10  更:2021-12-08 14:05:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/10 2:32:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码