数据结构-使用数组实现环形队列

2022-10-29 12:48:43
package com.atguigu.queue;import java.util.Scanner;publicclassCircleArrayQueueDemo{publicstaticvoidmain(String[] args){//测试一把
		System.out.println("测试数组模拟环形队列的案例~~~");// 创建一个环形队列
		CircleArray queue=newCircleArray(4);//说明设置4, 其队列的有效数据最大是3char key=' ';// 接收用户输入
		Scanner scanner=newScanner(System.in);//boolean loop=true;// 输出一个菜单while(loop){
			System.out.println("s(show): 显示队列");
			System.out.println("e(exit): 退出程序");
			System.out.println("a(add): 添加数据到队列");
			System.out.println("g(get): 从队列取出数据");
			System.out.println("h(head): 查看队列头的数据");
			key= scanner.next().charAt(0);// 接收一个字符switch(key){case's':
				queue.showQueue();break;case'a':
				System.out.println("输出一个数");int value= scanner.nextInt();
				queue.addQueue(value);break;case'g':// 取出数据try{int res= queue.getQueue();
					System.out.printf("取出的数据是%d\n", res);}catch(Exception e){// TODO: handle exception
					System.out.println(e.getMessage());}break;case'h':// 查看队列头的数据try{int res= queue.headQueue();
					System.out.printf("队列头的数据是%d\n", res);}catch(Exception e){// TODO: handle exception
					System.out.println(e.getMessage());}break;case'e':// 退出
				scanner.close();
				loop=false;break;default:break;}}
		System.out.println("程序退出~~");}}classCircleArray{privateint maxSize;// 表示数组的最大容量//front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素//front 的初始值 = 0privateint front;//rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.//rear 的初始值 = 0privateint rear;// 队列尾privateint[] arr;// 该数据用于存放数据, 模拟队列publicCircleArray(int arrMaxSize){
		maxSize= arrMaxSize;
		arr=newint[maxSize];}// 判断队列是否满publicbooleanisFull(){return(rear+1)% maxSize== front;}// 判断队列是否为空publicbooleanisEmpty(){return rear== front;}// 添加数据到队列publicvoidaddQueue(int n){// 判断队列是否满if(isFull()){
			System.out.println("队列满,不能加入数据~");return;}//直接将数据加入
		arr[rear]= n;//将 rear 后移, 这里必须考虑取模
		rear=(rear+1)% maxSize;}// 获取队列的数据, 出队列publicintgetQueue(){// 判断队列是否空if(isEmpty()){// 通过抛出异常thrownewRuntimeException("队列空,不能取数据");}// 这里需要分析出 front是指向队列的第一个元素// 1. 先把 front 对应的值保留到一个临时变量// 2. 将 front 后移, 考虑取模// 3. 将临时保存的变量返回int value= arr[front];
		front=(front+1)% maxSize;return value;}// 显示队列的所有数据publicvoidshowQueue(){// 遍历if(isEmpty()){
			System.out.println("队列空的,没有数据~~");return;}// 思路:从front开始遍历,遍历多少个元素// 动脑筋for(int i= front; i< front+size(); i++){
			System.out.printf("arr[%d]=%d\n", i% maxSize, arr[i% maxSize]);}}// 求出当前队列有效数据的个数publicintsize(){// rear = 2// front = 1// maxSize = 3return(rear+ maxSize- front)% maxSize;}// 显示队列的头数据, 注意不是取出数据publicintheadQueue(){// 判断if(isEmpty()){thrownewRuntimeException("队列空的,没有数据~~");}return arr[front];}}

1.rear永远指的是将要去赋值的地址
2.取模是为了循环
3.最后有效数据个数加上maxsize是为了防止负数
这张图更容易理解环形队列

  • 作者:wenchi656
  • 原文链接:https://blog.csdn.net/wenchi656/article/details/103811757
    更新时间:2022-10-29 12:48:43