java 数据结构 环形数组队列的理解
已经有很多博客都贴出了代码了,代码基本都和尚硅谷里的大同小异,下面分析下思路。
首先编写一个类,类应该包含:
属性:最大容量maxsize,队列头front,队列尾rear,模拟队列的数组arr[];
构造器,
类的方法:判断队列是否满,队列是否空,添加数据到队列,获取队列的数据,显示队列所有数据。
front:初始值为0,指向队列的第一个元素,arr[front]就是队列的第一个元素。
rear:初始值为0,rear指向队列的最后一个元素的后一个位置(也就是进来一个元素11,此时arr[0]=11,rear此时为1,再进来一个元素12,arr1[1]=12,rear就为2,数组的最大容量为maxsize,数组可以从arr[0]~arr[maxsize-1],但是环形数组队列的最大有效数据长度只能为maxsize-1,选maxsize为4时,有效数据长度就为3,再进来一个数13时,arr[2]=13,rear为3,此时可通过判断队列是否满的情况来分析)
取出元素: front = (front + 1)% maxsize
增加元素: rear = (rear+1) % maxsize
判断环形队列是否为空:front == rear
环形队列有效数据长度: (rear - front + maxsize)% maxsize
判断环形队列是否为满 :①(rear + 1)%maxsize == front (接着上面例子,front为0时,rear=3,此时可判断出队列是满,取出一个元素,front=1,增加一个元素14,arr[3]=14,rear=0,仍然可通过上式判断队列是否为满) ② 简洁明了的方法:直接判断队列中的有效数据长度是否等于最大有效数据长度maxsize-1,是的话则满。
rear指向队列的最后一个元素的后一个位置,因为环形链表的很多操作都会涉及到取余运算(x%maxsize)maxsize为数组的长度。x%maxsize的取值范围是[0,maxsize-1],所以让链表最大长度为maxsize-1时,就必须对数组空出一个位置,rear就指向队列的最后一个元素的后一个位置,如果让链表最大长度为maxsize,rear指向队列的最后一个元素的位置,当环形链表的很多操作取余数后,环形队列很多方法无法通过取余来判断。
import java.util.Scanner;
public class Circle {
public static void main(String[] args) {
System.out.println("测试数组模拟环形队列的案例~~~");
// 创建一个环形队列
circleArray queue = new circleArray(4); //说明设置4, 但是队列的有效数据最大是3
char key = ' '; // 接收用户输入
Scanner scanner = new Scanner(System.in);//
boolean loop = true;
// 输出一个菜单
while (loop)