队列特点 先进先出
数组队列 front 和 rear 值为 -1 front指向队列中第一个数据的前一个位置 rear指向最后一个数据本身
环形队列 front 和rear 值为 0 front 指向队列中第一个数据本身 rear 指向最后一个数据的后一个位置(在队列中需要预留一个空间用来添加数据),环形队列数据从头出 (取出的操作对front头指针操作) 从尾进 (添加操作对rear尾指针操作)
环形队列的代码实现
public class QueuePojo{
int[] arr;
int maxSize;
int rear;
int front;
//队列构造方法 arrLength 为队列大小
public QueuePojo(int arrLength) {
arr = new int[arrLength];
maxSize = arrLength;
rear = 0;
front = 0;
}
//判断队列是否为空
public boolean isEmpty() {
//当头指针与尾指针重叠说明队列中以无数据
return rear == front;
}
//判断队列是否已满
//rear+1 假设头指针在尾指针的后一个位置
// (rear + 1) % maxSize 的结果永远只会 <= maxSize
//第一种情况 (rear + 1) % maxSize的结果 < maxSize 在加上 == front 如果为true说明 头指针在尾指针的后一个位置 说明队列中的数据已满
//第二种情况 (rear + 1) % maxSize的结果 = maxSize 在加上 == front 如果为true说明 头指针在0的位置,尾指针到了队列长度减1的位置说明队列中的数据已满,还有一个空间是不存数据的这个空间是添加数据的预留空间并且这个空间位置是变动的,当取出数据时头指针发生变化不在等于0 这时又可以添加数据了
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
//队列中有效数据个数
public int length(){
// 为了计算有效数据个数 使用rear - front 但有可能 front > rear(因为是环形队列) 导致结果变成一个负数,所以在 + 一个maxSize 保证结果是正数。
//%maxSize是为了保证这个结果 < maxSize 或者等于maxSize,
return (rear + maxSize - front)%maxSize;
}
//查看头元素
public int getRearElement(){
if(isEmpty()) throw new RuntimeException("元素为空!");
//front指向队列中第一个元素 直接arr[front]即可
return arr[front];
}
//显示全部队列中的全部元素
public void showArrElement(){
if(isEmpty()) throw new RuntimeException("元素为空!");
//for循环只是确定了循环遍历次数(有效数据个数),不代表i不会数组下标越界,因此需要%maxSize来控制i的值
for (int i = front; i < front+length(); i++) {
System.out.printf("arr[%d]=%d",i%maxSize,arr[i%maxSize]);
}
}
//取出队列中的元素
public int getElement() {
if (isEmpty()) throw new RuntimeException("元素为空!");
//因为输出元素需要将其抛弃,而且要对头指针指向修改
int value = arr[front];
//这里的front+1类似 front++ 但是为了保证front不会下标越界加上%maxSzie
front = (front + 1) % maxSize;
return value;
}
//添加元素到队列
//添加元素是从队列尾部加入数据所以这个方法中操作rear尾部指针
public String addElement(int value) {
if (isFull()) throw new RuntimeException("元素已满!");
arr[rear] = value; //因为是添加操作直接先在尾部赋值随后 对rear进行类似++的操作
rear = (rear +1)%maxSize; //rear+1 因为需要在尾部永远保留一个预留空间, %maxSzie是为了保证这个数永远 <= maxSzie 否则可能下标越界
return "success";
}
}