网站首页 > 文章精选 正文
队列
队列是一种常用的数据结构,它的主要特点是先进先出(FIFO—first in first out),从队尾(rear)入队,从队头(front)出队。
队列的实现有很多方式,比如基础实现(数组 \ 链表),或结合了其他特性的变种(优先队列 \ 双端队列)等。
不考虑一些高级特性,基础实现中,数组队列存在空间复用导致的数据移动问题,链表队列则有占用空间大和碎片化的问题。
这些问题在当代应用层编程中,受益于高规格硬件和高级语言特性,绝大多数场景影响不大。
但是,在硬件底层开发,特别是嵌入式开发中还是有较大影响的。环形队列以其简单高效的实现特性,广泛用于网络数据收发,和不同程序间数据交换。
环形队列
实际的底层内存中是不存在环形结构的,环形队列真实使用的是数组的线性空间。
在真实实现过程中,由于判断队列空和判断队列满的条件都是头尾指针相等,存在二义性,所以一般将判断队列满的条件改为头尾差1,这样会造成最大容量比实际容量少一
队列空: Front = Rear
队列满: Front = Rear + 1
代码实现
public class CircularQueue {
/**
* capacity of queue
*/
private int capacity;
private int front = 0;
private int rear = 0;
private String[] data;
public CircularQueue(int capacity) {
this.capacity = capacity;
data = new String[capacity];
}
/**
* if queue full
*/
public boolean isFull() {
return (rear + 1) % capacity == front;
}
/**
* if queue empty
*/
public boolean isEmpty() {
return rear == front;
}
/**
* get data size in queue
*/
public int size() {
return (rear + capacity - front) % capacity;
}
/**
* enqueue
*/
public void enQueue(String ele) {
if (this.isFull()) {
throw new RuntimeException("CircularQueue full");
}
data[rear] = ele;
rear = (rear + 1) % capacity;
}
/**
* dequeue
*/
public String deQueue() {
if (this.isEmpty()) {
throw new RuntimeException("CircularQueue empty");
}
String res = data[front];
front = (front + 1) % capacity;
return res;
}
}
猜你喜欢
- 2024-12-24 mysql索引总结(二) mysql索引的使用和原理
- 2024-12-24 常见数据结构—线性表详解(超详细顺序表、链表)
- 2024-12-24 「C语言」链表的操作——增删改查——让你一次全弄懂
- 2024-12-24 单向链表基本操作你学会了吗 单向链表基本操作你学会了吗为什么
- 2024-12-24 深入理解HashMap 深入理解计算机系统第三版答案
- 2024-12-24 @程序员,你真的了解内存吗? 程序员不用担心内存管理
- 2024-12-24 详解双向链表的基本操作(C语言) 双向链表基本操作的实现
- 2024-12-24 编程知识:既然已经有数组了,为什么还要链表?
- 2024-12-24 哈希表原理及应用 哈希表工作原理
- 2024-12-24 链表是C语言的魅力:5个你必须知道的链表的类型,格式,用法
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)