我是一个计算机专业研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)的数据结构(可以用数组或者链表实现),意味着最早添加到队列中的元素将是最先被移除的。这种特性使得队列在很多场景中非常有用,例如任务调度、缓冲处理等。
访问:O(n)//最坏情况
插入删除:O(1)//后端插入前端删除元素
队列类型
使用数组实现举例:
1. 线性队列(Linear Queue)
最简单的队列形式,具有固定的前端和后端。
2. 循环队列(Circular Queue)
一种优化后的线性队列,其中最后一个位置连接到第一个位置,形成环形结构,从而更高效地利用存储空间。
3. 优先队列(Priority Queue)
队列中的每个元素都有一个关联的优先级,出队时总是移除具有最高优先级的元素(一般使用堆实现)。Java 中提供了 PriorityQueue
类来实现这一功能。
4. 双端队列(Deque, Double-ended Queue)
允许在两端进行插入和删除操作,既可以在前端也可以在后端执行入队和出队操作。Java 提供了 Deque
接口以及它的多个实现类如 ArrayDeque
和 LinkedList
。
自定义循环队列Java代码手搓实现🖊️
/*** @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
接口:
方法名 | 签名 | 说明 |
---|---|---|
add | boolean add(E e) | 将指定元素插入队列(如果立即可用),成功时返回true ;如果队列已满,则抛出IllegalStateException 。 |
offer | boolean offer(E e) | 将指定元素插入队列(如果立即可用),成功时返回true ;如果队列已满,则返回false 。 |
remove | E remove() | 检索并移除队列头部元素;如果队列为空,则抛出NoSuchElementException 。 |
poll | E poll() | 检索并移除队列头部元素;如果队列为空,则返回null 。 |
element | E element() | 检索但不移除队列头部元素;如果队列为空,则抛出NoSuchElementException 。 |
peek | E peek() | 检索但不移除队列头部元素;如果队列为空,则返回null 。 |
栈介绍
栈和队列相似,只不过栈按照 后进先出(LIFO, Last In First Out) 的原理运作。在栈中,push 和 pop 的操作都发生在栈顶。
栈常用一维数组或链表来实现,用数组实现的栈叫作 顺序栈 ,用链表实现的栈叫作 链式栈 。