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

数据结构——队列和栈(介绍、类型、Java手搓实现循环队列)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研)
记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结+网上借鉴)
希望大家能一起发现问题和补充,也欢迎讨论👏👏👏

文章目录

  • 队列
    • 队列介绍
    • 队列类型
      • 1. 线性队列(Linear Queue)
      • 2. 循环队列(Circular Queue)
      • 3. 优先队列(Priority Queue)
      • 4. 双端队列(Deque, Double-ended Queue)
    • 自定义循环队列Java代码手搓实现🖊️
    • Java中的Queue
    • 栈介绍

队列

队列介绍

队列(Queue)是一种遵循先进先出原则(FIFO, First In First Out)的数据结构(可以用数组或者链表实现),意味着最早添加到队列中的元素将是最先被移除的。这种特性使得队列在很多场景中非常有用,例如任务调度、缓冲处理等。

img

访问:O(n)//最坏情况
插入删除:O1//后端插入前端删除元素

队列类型

使用数组实现举例:

1. 线性队列(Linear Queue)

最简单的队列形式,具有固定的前端和后端。

2. 循环队列(Circular Queue)

一种优化后的线性队列,其中最后一个位置连接到第一个位置,形成环形结构,从而更高效地利用存储空间。

3. 优先队列(Priority Queue)

队列中的每个元素都有一个关联的优先级,出队时总是移除具有最高优先级的元素(一般使用堆实现)。Java 中提供了 PriorityQueue 类来实现这一功能。
在这里插入图片描述

4. 双端队列(Deque, Double-ended Queue)

允许在两端进行插入和删除操作,既可以在前端也可以在后端执行入队和出队操作。Java 提供了 Deque 接口以及它的多个实现类如 ArrayDequeLinkedList

自定义循环队列Java代码手搓实现🖊️

img

/**
 * @author:Camel
 * @date:2025/1/17
 * @description:循环队列
 */
public class CircularQueue<T> {
    private T[] elements; // 存储队列元素的数组
    private int front;    // 队首指针
    private int rear;     // 队尾指针
    private int capacity; // 队列的最大容量
    private int count;    // 当前队列中的元素数量

    // 构造函数初始化
    public CircularQueue(int capacity) {
        this.capacity = capacity;
        this.front = 0;
        this.rear = -1;
        this.count = 0;
        this.elements = (T[]) new Object[capacity];
    }

    // 入队操作
    public boolean enqueue(T element) {
        if (isFull()) {
            return false; // 队列已满
        }
        rear = (rear + 1) % capacity;
        elements[rear] = element;
        count++;
        return true;
    }

    // 出队操作
    public T dequeue() {
        if (isEmpty()) {
            return null; // 队列为空
        }
        T item = elements[front];
        elements[front] = null; // 可选:帮助垃圾回收
        front = (front + 1) % capacity;
        count--;
        return item;
    }

    // 查看队首元素
    public T peek() {
        if (isEmpty()) {
            return null;
        }
        return elements[front];
    }

    // 检查队列是否为空
    public boolean isEmpty() {
        return count == 0;
    }

    // 检查队列是否已满
    public boolean isFull() {
        return count == capacity;
    }

    // 获取队列大小
    public int size() {
        return count;
    }

    // 打印队列内容
    public void printQueue() {
        if (isEmpty()) {
            System.out.println("Queue is empty");
            return;
        }
        for (int i = 0, index = front; i < count; i++, index = (index + 1) % capacity) {
            System.out.print(elements[index] + " ");
        }
        System.out.println();
    }
}

Java中的Queue

Queue接口:

img

方法名签名说明
addboolean add(E e)将指定元素插入队列(如果立即可用),成功时返回true;如果队列已满,则抛出IllegalStateException
offerboolean offer(E e)将指定元素插入队列(如果立即可用),成功时返回true;如果队列已满,则返回false
removeE remove()检索并移除队列头部元素;如果队列为空,则抛出NoSuchElementException
pollE poll()检索并移除队列头部元素;如果队列为空,则返回null
elementE element()检索但不移除队列头部元素;如果队列为空,则抛出NoSuchElementException
peekE peek()检索但不移除队列头部元素;如果队列为空,则返回null

栈介绍

栈和队列相似,只不过栈按照 后进先出(LIFO, Last In First Out) 的原理运作。在栈中,push 和 pop 的操作都发生在栈顶。

栈常用一维数组或链表来实现,用数组实现的栈叫作 顺序栈 ,用链表实现的栈叫作 链式栈

img


http://www.kler.cn/a/509043.html

相关文章:

  • Web自动化:Cypress 测试框架概述
  • 深入理解 D3.js 力导向图:原理、调参与应用
  • php-2025面试题准备
  • 联合体(Union)
  • Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)
  • 如何制作符合自己设备的FLM下载算法
  • RV1126+FFMPEG推流项目(5)VI和VENC模块绑定,并且开启线程采集
  • 【Django开发】django美多商城项目完整开发4.0第12篇:商品部分,表结构【附代码文档】
  • 动手学大数据-1大数据体系介绍与 SQL 处理流程
  • 58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1
  • Python 调整 Excel 中的行列顺序
  • 【漫话机器学习系列】053.梯度爆炸(Exploding Gradient Problem)
  • Day30上 - ChromaDB 向量数据库
  • 基于springboot+vue的食物营养分析与推荐网站的设计与实现
  • 性能测试实时监听工具Influx+Grafana
  • Banana Pi BPI-RV2 RISC-V路由开发板采用矽昌通信SF2H8898芯片
  • Web开发 -前端部分-CSS-2
  • 搜广推实习面经三
  • 机器学习之决策树(DecisionTree)
  • AD域学习笔记
  • 基于C语言的通讯录实现
  • Kotlin语言的数据库交互
  • UI自动化测试:异常截图和page_source
  • 模拟练习题
  • BilibiliPotPlayer插件的登录第二天失效,无法看高清视频,要删掉浏览器上的cookie
  • Linux初识:【Linux软件包管理器yum】【Linux编辑器-vim的使用】【Linux编译器-gcc/g++的使用】