用java代码完成环形队列

环形队列:
1.思路:
rear:指向最后一个元素的后一个位置。空出来一个位置做约定。初始值为0.
front:指向第一个元素。初始值为0.
maxSize:为数组的长度。
队列是否满:(rear - front + maxSize + 1) % maxSize == 0;
简化为(rear + 1) % maxSize == 0;
队列的长度:(rear - front + maxSize) % maxSize;
这里明明(rear - front)%maxSize看起来也一样为什么要加上一个maxSize呢?
因为rear - front 有可能为负数类似于下面这种情况:
在这里插入图片描述

2.代码:

package circleQuaua;

public class CircleQuaua {
//创建环形队列并增取查
	int maxSize;//队列的长度
	int front;//队列头
	int rear;//队列尾
	int arr[];//数组
	public CircleQuaua(int max){
		maxSize = max;
		arr = new int [max];	
	}
	public boolean isFull(){
		return (rear + 1) % maxSize == front;
	}
	public boolean isEmpty(){
		return rear == front;
	}
	//增加一个元素
	public void add(int n){
		if(isFull()){
			System.out.println("数组已经满啦");
			return;
		}
		arr[rear] = n;
		rear = (rear + 1) % maxSize; 
	}
	//取出第一个元素
	public int get(){
		if(isEmpty()){
			throw new RuntimeException("数组是空的");
		}
		int val = arr[front];
		front = (front + 1) % maxSize;
		return val;
	}
	//查看数组
	public void check(){
		if(isEmpty()){
			throw new RuntimeException("数组是空的");
		}
		for (int i = front; i < front +size(); i++) {
			System.out.print(arr[i%maxSize] + "  ");
		}
		System.out.println();
	}
	//队列的长度
	public int size(){
		return (rear - front +maxSize) % maxSize;
	}
}

3.难点:为什么要取余操作呢?
因为数组的长度是有限的当front或者rear已经等于数组的长度的时候想要在加一得回到数组的开头也就是arr[0];如果不取余就会造成越界异常。这也是环形队列为什么能重复使用数组的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值