队列是一个有序列表,能够用数组或是链表来实现。
遵循先入先出的准则,即:先存入队列的数据,要先取出。后存入的要后取出。
数组实现队列
数组队列
思路:
front=-1 指向队列头的前一个地位
rear=-1 指向队列尾的数据(即就是队列最初一个数据)
判断队列是否满:front ==rear
判断队列是否空:rear == maxSize-1
class ArrayQueue { private int maxSize; // 示意数组的最大容量 private int front; // 队列头 private int rear; // 队列尾 private int[] arr; // 该数据用于存放数据, 模仿队列 // 创立队列的结构器 public ArrayQueue(int arrMaxSize) { maxSize = arrMaxSize; arr = new int[maxSize]; front = -1; // 指向队列头部,剖析出front是指向队列头的前一个地位. rear = -1; // 指向队列尾,指向队列尾的数据(即就是队列最初一个数据) } // 判断队列是否满 public boolean isFull() { return rear == maxSize - 1; } // 判断队列是否为空 public boolean isEmpty() { return rear == front; } // 增加数据到队列 public void addQueue(int n) { // 判断队列是否满 if (isFull()) { System.out.println("队列满,不能退出数据~"); return; } rear++; // 让rear 后移 arr[rear] = n; } // 获取队列的数据, 出队列 public int getQueue() { // 判断队列是否空 if (isEmpty()) { // 通过抛出异样 throw new RuntimeException("队列空,不能取数据"); } front++; // front后移 return arr[front]; } // 显示队列的所有数据 public void showQueue() { // 遍历 if (isEmpty()) { System.out.println("队列空的,没有数据~~"); return; } for (int i = 0; i < arr.length; i++) { System.out.printf("arr[%d]=%d\n", i, arr[i]); } }
环形队列
思路:
front=0 指向队列第一个元素,也就是说arr[front]就是队列第一个元素
rear=0 指向队列的最初一个元素的后一个地位,因为心愿空进去一个空间作为约定
判断队列是否满:(rear + 1)% maxSize = front = 0
判断队列是否空:rear == front
队列中无效数据个数:(rear + maxSize - front) % maxSize
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; }