队列
1.队列:
特点:
队列是一个有序列表,可以用数组或者是链表来实现
遵循先进先出的原则
思路分析:
添加时:
如果rear ==maxsize-1时 表示储存满,不可再添加,如果rear != maxsize-1 则表示队列有空间可添加,将数据存入rear所指的数组元素中
删除时:
如果front==rear时,表示空,不能删除数,否则front后移
思维导图:
代码实现:
1 class Queue02 { 2 private int heigth;//指向队列头部,但不包含头部 3 private int end;//队列尾部包含队列尾部 4 private int maxSize;//最大存储量 5 private int[] array;//容器 6 //初始化数据 7 public void init(int size) { 8 heigth = -1; 9 end = -1; 10 maxSize = size; 11 array = new int[maxSize - 1]; 12 } 13 //判断是否为空 14 public Boolean isNull() { 15 return heigth == end; 16 } 17 //判断是否满 18 public Boolean isFull() { 19 return end == maxSize-1; 20 } 21 //添加数据 22 public void add(int sum) { 23 if (!isFull()) { 24 array[++end] = sum; 25 } else { 26 System.out.println("队列已满"); 27 } 28 } 29 //删除数据 30 public void dele() { 31 if (!isNull()) { 32 heigth++; 33 } else { 34 System.out.println("为空"); 35 } 36 } 37 //查看所有数据 38 public void see() { 39 if (!isNull()) { 40 for (int i = 0; i <= array.length; i++) { 41 System.out.println("第" + i + "个数据为:" + array[i]); 42 } 43 } 44 } 45 //取出数据 46 public void heigth() { 47 if (!isNull()) { 48 System.out.println("头数据为" + array[heigth+1]); 49 } 50 } 51 }
缺点:
目前数组使用就不能使用了,没有达到复用的效果
将这个数组使用算法,改进成一个环形的数组 核心使用取模(%)来实现的
2. 数组模拟环形队列:
思路分析:
- front指向队列的第一个元素,即front==0;
- Rear 指向队列的最后一个元素的后一个位置,即rear==0,
- 当队列满时:(rear+1) % maxSize = front;
- 当队列空时:front = rear;
- 有效数据的个数:(rear + maxSize - front) % maxSize
没怎么理解的同学多套用一下数据
思路图解:
代码实现:
class Loop{ private int heigth;//指向队列头部包含头部 private int end;//队列尾部后一个数据 private int maxSize;//最大存储量 private int[] array;//容器 //初始化数据 public void init(int size) { maxSize = size; array = new int[maxSize]; } //判断是否为空 public Boolean isNull() { return heigth == end; } //判断是否满 public Boolean isFull() { return (end + 1)%maxSize == heigth; } //添加数据 public void add(int sum) { if (!isFull()) { array[end] = sum; end = (end+1)%maxSize; } else { System.out.println("队列已满"); } } //删除数据 public void dele() { if (!isNull()) { //先把front int value = array[heigth]; heigth= (heigth+1)%maxSize; } else { System.out.println("为空"); } } //查看所有数据 public void see() { if (!isNull()) { for (int i = heigth; i <= (sizeSum()); i++) { System.out.println(array[i%maxSize]); } } } //取出数据 public void heigth() { if (!isNull()) { System.out.println("头数据为" + array[heigth]); } } public int sizeSum() { return (end + maxSize - heigth)%maxSize; } }