您的位置:首页 > 其它

循环队列的探索

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个向前移动,从而删除第一个元素,使用队列,仅仅需要移动‘指针’,进而覆盖第一个元素,复杂度降低为线性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: