数据结构-队列
一、介绍
1.1 队列是什么结构
队列和生活中排队的场景非常一致,先来的人先买后来的人后买,后来的人只能站在队尾,不允许插队。队列和栈一样,也是一种操作受限的线性表数据结构。
其他特殊队列:循环队列、阻塞队列、并发队列
二、队列的实现
与栈一样,队列可以基于数组实现也可以基于链表来实现。分别称为顺序队列和链式队列。
2.1 基于数组的顺序队列的实现
public class ArrayQueue{
private String[] items;
private int n=0;
//队头下标
private int head=0;
//队尾下标
private int tail=0;
//构造方法
public ArrayQueue(int capacity){
items = new String(capacity);
n = capacity;
}
//入队
public boolean enqueue(String item){
if(tail==n){
return false; //队列已满
}
items[tail] = item;
tail++;
return true;
}
//出队
public String dequeue(){
if(head==tail){
return null; //队列为空
}
String ret=items[head];
++head;
return ret;
}
}
2.2 一般队列存在的问题
在2.1的顺序队列中中,数据出队后,head指针前面,会存在未占用的空间无法得到使用。这样的话,可能需要进行数据搬移。
数据搬移方案:在插入数据时,如果tail指向了数组尾部,则进行一次数据搬移,将head搬移到下标为0的位置
2.3 循环队列
- 循环队列,是将普通队列首尾相连,那么他就变成了循环队列。这样的话,就避免了数据搬移的损耗,但是也增加了操作的复杂度。
- 循环队列判断队列空的话,也是tail=head,但是判断队列满的话,就比较特殊,因为要留出1个位置不能存值,来判断队列满和空的区别。循环队列队列满的话,为** (tail+1)%n=head**
public class CircularQueue{
private String[] items;
private int n=0;
private int head=0;
private int tail=0;
//构造方法
public CircularQueue(int capacity){
items=new String[capacity];
n=capacity;
}
//入队
public boolean enqueue(String item){
if((tail+1)%n=head){
return false; //队列已满
}
itmes[tail] = item;
tail=(tail+1)%n;
return true;
}
//出队
public String dequeue(){
if(head ==tail ){
return null; //队列已空
}
String ret=items[hdead];
head = (head +1 ) % n;
return ret;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能