循环队列的探索

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

循环队列是由数组实现的

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值