数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解

一:使用数组模拟环形队列

1:类中属性定义及注意事项

1.1:数组模拟的环形队列可以重复使用。
1.2:front:默认值为0,指向队列中的第一个元素所在位置
1.3: rear:默认值为0,指向队列中最后一个元素所在位置的后一个位置
1.4: maxSize: 值为数组长度,包含了被作为约束而空出来的下标7的位置
1.5:rear永远指向一个空的位置

2.数组模拟环形队列代码

2.1:CircleArrayQueue类代码
class CicrleArray{
	int front;
	int rear;
	int arr[];
	int maxSize;
	
	public CicrleArray(int size) {
		maxSize=size;
		arr=new int[size];
		front=0;
		rear=0;
	}
	
	/**
	 * 判断队列是否为空
	 * @return
	 */
	public boolean isNull() {
		return front==rear;
	}
	
	/**
	 * 判断队列是否满
	 * @return
	 */
	public boolean isFull() {
		return (rear+1)%maxSize==front;
	}
	
	/**
	 * 添加元素到队列中到方法
	 * @param n
	 */
	public void add(int n) {
		if(isFull()) {
			System.out.println("数组已满不能添加");
			return;
		}
		arr[rear]=n;
		rear=(rear+1)%maxSize;
		System.out.println("添加成功");
	}
	
	/**
	 * 提取队列中的元素
	 * @return
	 */
	public int get() {
		if(isNull()) {
			throw new RuntimeException("数组为空不能取出数据");
		}
		int value=arr[front];
		front=(front+1)%maxSize;
		return value;
	}
	
	/**
	 * 获取队列中有效数据的个数
	 * @return
	 */
	public int size() {
		return (rear+maxSize-front)%maxSize;
	}
	
	/**
	 * 遍历队列中所有有效数据
	 */
	public void show() {
		if(isNull()) {
			throw new RuntimeException("数组为空不能遍历");
		}
		for (int i = front; i < front+size(); i++) {
			//i%maxSize==>防止数组下标越界
			System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
		}
	}
2.2:main方法用于测试
CicrleArray cicrleArray = new CicrleArray(8);
		boolean loop=true;
		char c=' ';
		Scanner scanner = new Scanner(System.in);
		while(loop) {
			System.out.println("s=show");
			System.out.println("a=add");
			System.out.println("g=get");
			System.out.println("e=exit");
			char charAt = scanner.next().charAt(0);
			switch (charAt) {
			case 's':
				try {
					cicrleArray.show();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'a':
				System.out.println("输入一个数字");
				int nextInt = scanner.nextInt();
				cicrleArray.add(nextInt);
				break;
			case 'g':
				try {
					cicrleArray.get();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'e':
				loop=false;
				break;

			}
			
		}
		System.out.println("exit...");

3.图解

3.1: 队列创建好的默认状态

代码:

CicrleArray cicrleArray = new CicrleArray(8);

创建一个长度为8,也就是maxSize为8的数组来存放数据,其中可供用于存放数据的位置有7个

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第1张图片

3.2:开始执行第一次添加操作…添加一个数据10到链表内

代码:

arr[rear]=1;//arr[0]=1
rear=(rear+1)%maxSize;//rear后移
此时rear值变为(0+1)%8=1

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第2张图片

3.2:开始执行第二次添加操作…添加一个数据20到链表内

代码:

arr[rear]=20;//arr[1]=20
rear=(rear+1)%maxSize;//rear后移
此时rear值变为(1+1)%8=2

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第3张图片

3.3:开始执行第三次添加操作…添加一个数据30到链表内

代码:

arr[rear]=30;//arr[2]=30
rear=(rear+1)%maxSize;//rear后移
此时rear值变为(2+1)%8=3

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第4张图片

3.4:开始执行第四次添加操作…添加一个数据40到链表内

代码:

arr[rear]=40;//arr[3]=40
rear=(rear+1)%maxSize;//rear后移
此时rear值变为(3+1)%8=4

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第5张图片

3.5:开始执行第x次添加操作…添加一个数据xx到链表内

rear=(rear+1)%maxSize;//rear后移
此时rear值变为7
添加到这个时候 已经符合(rear+1)%maxSize==front的条件,所以队列已满

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第6张图片

3.6:开始执行第一次取出操作

代码:

int value=arr[front];//int value=arr[0]==》value=10
front=(front+1)%maxSize; //front=(0+1)%8==》front=1

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第7张图片
数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第8张图片

3.7:取出后再进行一次添加操作,添加一个888到链表内

代码:

arr[rear]=888;//arr[7]=888
rear=(rear+1)%8;//rear=(7+1)%8;==>rear=0

取出后rear+1并取余,也就变成了rear=0,到了之前存放值为10的位置

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第9张图片
数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第10张图片

这段时间开始学习算法,这系列博客用于记录每天所学知识,和用自己的理解尽可能的将其给大家讲清楚原理,如果有不对的地方还希望大家加以指正。

如果需要pdf文件可以私信我拿:chenhan-wu

如果本篇文章对你有帮助,还请点赞关注,长期更新!下面的赞赏码一分也是爱哈哈

数据结构与算法二:JAVA中使用数组模拟环形队列及详细的添加/取出图解_第11张图片

你可能感兴趣的:(JAVA数据结构与算法,队列,链表,算法,数据结构,java)