循环队列的探索

在《算法的乐趣》书中,发现了循环队列的实际应用,再次回顾循环队列

循环队列是由数组实现的

循环队列的关键在于尾指针 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个向前移动,从而删除第一个元素,使用队列,仅仅需要移动‘指针’,进而覆盖第一个元素,复杂度降低为线性。


おすすめ

転載: blog.csdn.net/juttajry/article/details/51106080