环形队列
1. 定义
环形队列就是将队列在逻辑上看作环形结构、物理上仍是数组形式存储的一种数据结构。
2. 实现
2.1 记录空间法
使用used标识当前存储了多少元素,如果为空,那么就将head移到0位置处,如果满了,那么就将tail移到0位置处
1. 入队
普通情况:
队列满了:
这时就需要tail=0,等待某个时候有元素出队,这个时候新插入的元素就又能在tail的位置进行插入。
2. 代码实现
package MyCircleQueue;
public class CircleQueue {
int size = 5;// 队列最大容量
int used = 0;// 队列已使用元素
int[] data = new int[size];// 存储队列数据
int tail = 0, head = 0;// 队列头尾指针
public void offer(int val) {
// 满了
if (used == size) {
tail = 0;
System.out.println("满了");
return;
}
// 没满
data[tail++] = val;
used++;
System.out.println("存入"+val);
}
public int poll() {
if (used == 0) {
head = 0;
System.out.println("空了");
return -1;
}
int ret = data[head++];
used--;
System.out.println("取出:"+ret);
return ret;
}
}
2.2 浪费空间法
在这种方式中,我们只使用头尾两个指针进行计算,并将 head = tail 的情况记作空,将 (tail+1)%size = head 的情况记作满
。
2.2.1实现代码:
package MyCircleQueue;
public class CircleQueue2 {
int size = 5;
int[] data = new int[size];
int head= 0, tail = 0;
public void offer(int val) {
if ((tail+1) % size == head) {
System.out.println("满了");
return;
}
data[tail++] = val;
System.out.println("入队:"+val);
}
public int poll() {
if (head == tail) {
System.out.println("空了");
return -1;
}
int ret = data[head++];
System.out.println("出队:"+ret);
return ret;
}
}
3. 测试代码:
package MyCircleQueue;
public class Test {
public static void main(String[] args) {
CircleQueue queue = new CircleQueue();
for (int i = 0; i < 10; i++) {
queue.offer(i);
}
for (int i = 0; i < 10; i++) {
int ret = queue.poll();
}
}
}
4. 结论
方法 | 满的标记 | 空的标记 |
---|---|---|
浪费空间法 | (tail+1)%size == head | head == tail |
标记长度法 | used == size | used == 0 |
原文地址:https://blog.csdn.net/leadera_/article/details/134751579
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_46700.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。