循环队列的探索
2016-04-09 17:11
197 查看
在《算法的乐趣》书中,发现了循环队列的实际应用,再次回顾循环队列
循环队列是由数组实现的
循环队列的关键在于尾指针 rear的变化,因为它确定数组会不会越界
情况1:rear表示当前插入位置的下标
public class CyclicQ2 { static int[] queue = new int[9]; static int front = 0; static int rear = -1; static void insert(int key) { if (rear != -1 && (rear + 1) % 9 == front) { rear++; queue[rear % 9] = key; front++; return; } queue[++rear] = key; } public static void main(String[] args) { for (int i = 0; i < 17; i++) insert(i); System.out.println(rear + " " + front); for (int i = front; i <= rear; i++) System.out.println(queue[i % 9]); } }
此时,仅仅是在插入首元素时候,会被以为是数组已经满了,因此会有一个判断区分这种情况
情况2:rear表示当前的元素个数
public class CyclicQ3 { static int[] queue = new int[9]; static int front = 0; static int rear = 0; static void insert(int key) { if ((rear + 1) % 9 == front) { queue[rear % 9] = key; rear++; front++; return; } queue[rear++] = key; } public static void main(String[] args) { for (int i = 0; i < 10; i++) insert(i); System.out.println(rear + " " + front); for (int i = front; i < rear; i++) System.out.println(queue[i % 9]); } }
此时在插入时没有任何问题,但是在显示元素时,发现,其实在数组还没有满的时候,front已经移动了,因此,显示的时候应该从front-1开始,才是第一个没有被覆盖的元素
此处之所以用循环队列,就是避免了数组元素需要每次999个向前移动,从而删除第一个元素,使用队列,仅仅需要移动‘指针’,进而覆盖第一个元素,复杂度降低为线性。
相关文章推荐
- Eclipse的一些常用命令
- 16链表的反转|剑指offer
- centos7下使用yum安装mysql
- CALayer核心动画
- hibernate映射多对多,一对一,一对多,自身关联综合应用
- Fibonacci
- 杭州电子科技大学(HDU)ACM刷题---------选择排序之2020
- java多线程 典型案例:子线程执行10次,主线程执行100次,两者交替50次
- [BZOJ 1012][JSOI2008]最大数maxnumber
- 缩小页面,按比例缩小
- Python基本语句
- NFS SERVER 引起aix系统无法启动
- fork和vfork程序验证区别
- linux下移植电容屏驱动gt9xx 笔记
- 操作系统常用调度算法叙述 中间件
- 通过GhostDoc实现自定义方法概要(summary)
- 初步学习C++中的继承关系
- 关于写xml字符串的一些积累
- poj 1995
- Django 开发的自动化运维平台