思绪剖析:
1. front 变量的寄义做一个调解: front 就指向行列的第一个元素, 也就是说 arr[front] 就是行列的第一个元素
front 的初始值 = 0
2. rear 变量的寄义做一个调解:rear 指向行列的末了一个元素的后一个位置. 由于愿望空出一个空间做为商定
rear 的初始值 = 0
3. 当行列满时,前提是 (rear + 1) % maxSize == front 【满】
4.行列为空的前提, rear == front 空
5. 当我们如许剖析, 行列中有用的数据的个数 (rear + maxSize - front) % maxSize // rear = 1 front = 0
6. 我们就能够在本来的行列上修正获得,一个环形行列
java相干视频教程分享:java进修视频
代码完成:
import java.util.Scanner; public class CircleArrayQueueDemo { 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) { 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("顺序退出~~"); } } class CircleArray { private int maxSize; // 示意数组的最大容量 //front 变量的寄义做一个调解: front 就指向行列的第一个元素, 也就是说 arr[front] 就是行列的第一个元素 //front 的初始值 = 0 private int front; //rear 变量的寄义做一个调解:rear 指向行列的末了一个元素的后一个位置. 由于愿望空出一个空间做为商定. //rear 的初始值 = 0 private int rear; // 行列尾 private int[] arr; // 该数据用于寄存数据, 模仿行列 public CircleArray(int arrMaxSize) { maxSize = arrMaxSize; arr = new int[maxSize]; } // 推断行列是不是满 public boolean isFull() { return (rear + 1) % maxSize == front; } // 推断行列是不是为空 public boolean isEmpty() { return rear == front; } // 增加数据到行列 public void addQueue(int n) { // 推断行列是不是满 if (isFull()) { System.out.println("行列满,不能到场数据~"); return; } //直接将数据到场 arr[rear] = n; //将 rear 后移, 这里必需斟酌取模 rear = (rear + 1) % maxSize; } // 猎取行列的数据, 出行列 public int getQueue() { // 推断行列是不是空 if (isEmpty()) { // 经由过程抛出非常 throw new RuntimeException("行列空,不能取数据"); } // 这里须要剖析出 front是指向行列的第一个元素 // 1. 先把 front 对应的值保留到一个暂时变量 // 2. 将 front 后移, 斟酌取模 // 3. 将暂时保留的变量返回 int value = arr[front]; front = (front + 1) % maxSize; return value; } // 显现行列的一切数据 public void showQueue() { // 遍历 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]); } } // 求出当前行列有用数据的个数 public int size() { // rear = 2 // front = 1 // maxSize = 3 return (rear + maxSize - front) % maxSize; } // 显现行列的头数据, 注重不是掏出数据 public int headQueue() { // 推断 if (isEmpty()) { throw new RuntimeException("行列空的,没有数据~~"); } return arr[front]; } }
相干文章教程分享:java疾速入门
以上就是java中运用数组完成环形行列的细致内容,更多请关注ki4网别的相干文章!