队列的概念和简单实现
一 前言
本篇读者将学习到队列的概念,队列的基本操作方法,java自带的队列操作方式,简单的使用实现队列;知识追寻者都感觉队列比较好学,毕竟生活中无处不在;
二 队列的概念
队列是一种只能在一端(队尾)插入数据,另一端(队首)删除数据的线性结构;
如何简单的理解,比如做动车快要发车的时候,许多乘客都在进站的路口进行排队刷票,刷一张票就是进站一个人,就可以比作队首删除一个数据,同理如果有新乘客要上动车,则需要排在队尾,表示添加数据;
三 java原生的队列
队列的主要方法如下:
- peek() 队首值
- offer() 向队尾插入数据
- poll() 队首值,并且删除队首
- element() ,队列中弹出队首值
public static void main(String[] args) {
// 创建队列
Queue<String> queue = new LinkedList<>();
// 往队列中加数据
queue.offer("1");
queue.offer("2");
queue.offer("3");
queue.offer("4");
queue.offer("5");
// 返回第一个元素
System.out.println(queue.element());
// 返回队首值
System.out.println(queue.peek());
// 返回第一个元素,并在队列中删除
System.out.println(queue.poll());
// 遍历队列
for (String str: queue) {
System.out.print(str);
}
}
输出
1
1
1
2345
四 队列的简单实现
实现思路,由于使用数组需要2个索引指针,前索引表示队首索引,后索引表示队尾索引;
当向队列中添加数据时后索引向后移动一位;当从队列中弹出数据时前索引向后移动一位;
同理根之前栈的文章一致,每种数据结构都应该有容量;
比较重要的一个算法是每当索引往后移动时,可以使用 ( rear + 1 ) % capacity
表示下一索引的位置;
比如 容量为6 , 此时数据的索引为2,插入数据后 索引 的值 就是 ( 2 + 1 ) % 6 = 3 ;
public class ArrayQueue {
// 队首
private int front;
// 队尾
private int rear;
// 容量
private int capacity;
// 数组
private Object[] array;
// 构造方法
ArrayQueue(int size) {
capacity = size;
// 队首初始化值 -1 表示空队列
front = -1;
// 队尾初始化值 -1 ,表示空队列
rear = -1;
array = new Object[capacity];
}
// 空队列
public boolean isEmpty(){
// 如果队首是默认值-1,就是空队列
return front == -1;
}
// 满队列
public boolean isFull(){
// 如果队尾索引等于队首, 就是满队列
return ( rear + 1 ) % capacity == front;
}
// 入队
public void offer(int data){
if (isFull()){
System.out.println("队列已满");
}else {
// 队尾 + 后移
rear = (rear + 1) % capacity;
// 数据进入队列
array[rear] = data;
// 保证第一次数据入队时,队首索引=队尾索引=0
if (front==-1){
front = rear;
}
}
}
// 出队
public Object poll(){
Object data = null;
if (isEmpty()){
System.out.println("空队列");
}else {
// 队首出队
data = array[front];
// 队首索引 后移
front = (front + 1) % capacity;
}
return data;
}
public Object peek(){
return array[front];
}
}
测试
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(4);
queue.offer(1);
queue.offer(2);
queue.offer(3);
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.peek());
System.out.println(queue.poll());
}
输出
1
2
3
null
null
当然使用数据的实现方式,很浪费空间,一站式应用仅提供学习理解队列;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix