1、源码

ArrayQueue

  1. package com.study.queue;
  2. //使用数组模拟一个队列
  3. public class ArrayQueue {
  4. private int maxSize;//表示数组的最大容量
  5. private int front;//队列头
  6. private int rear;//队列尾
  7. private int[] arr;//该数组用于存放数据,模拟队列
  8. //创建队列构造器
  9. public ArrayQueue(int arrMaxSize){
  10. maxSize = arrMaxSize;
  11. arr = new int[maxSize];
  12. front=-1;//指向队列头部,前一个数据
  13. rear=-1;//指向队尾
  14. }
  15. //判断队列是否满
  16. public boolean isFull(){
  17. return rear==maxSize-1;
  18. }
  19. //判断队列是否空
  20. public boolean isEmpty(){
  21. return front==rear;
  22. }
  23. //添加数据到队列
  24. public void addQueue(int n){
  25. if(isFull()){
  26. System.out.println("队列满,不能加数据");
  27. return;
  28. }
  29. rear++;
  30. arr[rear]=n;
  31. }
  32. //获取队列的数据
  33. public int getQueue(){
  34. if(isEmpty()){
  35. throw new RuntimeException("队列空,不能去数据");
  36. }
  37. front++;
  38. return arr[front];
  39. }
  40. //显示队列所有数据
  41. public void show(){
  42. if(isEmpty()){
  43. System.out.println("队列空,没有数据");
  44. return;
  45. }
  46. for (int i : arr) {
  47. System.out.println(i);
  48. }
  49. }
  50. //显示队列的头数据
  51. public int headQueue(){
  52. if (isEmpty()){
  53. throw new RuntimeException("队列空,没有数据");
  54. }
  55. return arr[front+1];
  56. }
  57. }

ArrayQueueDemo

  1. package com.study.queue;
  2. import java.util.Scanner;
  3. public class ArrayQueueDemo {
  4. public static void main(String[] args) {
  5. ArrayQueue queue = new ArrayQueue(3);
  6. String key=null;
  7. Scanner scanner = new Scanner(System.in);
  8. boolean loop = true;
  9. System.out.println("s(show),显示队列");
  10. System.out.println("e(exit),退出程序");
  11. System.out.println("a(add),添加数据到队列");
  12. System.out.println("g(get),从队列中获取数据");
  13. System.out.println("h(head),显示队列头的数据");
  14. while(loop){
  15. key=scanner.nextLine();
  16. switch (key){
  17. case "s":
  18. queue.show();
  19. break;
  20. case "a":
  21. System.out.println("输入一个数");
  22. int value = scanner.nextInt();
  23. queue.addQueue(value);
  24. break;
  25. case "g":
  26. try{
  27. int res = queue.getQueue();
  28. System.out.println("取出的数据是"+res);
  29. }catch (Exception e){
  30. System.out.println(e.getMessage());
  31. }
  32. break;
  33. case "h":
  34. try{
  35. int res = queue.headQueue();
  36. System.out.println("队列头的数据是"+res);
  37. }catch (Exception e){
  38. System.out.println(e.getMessage());
  39. }
  40. break;
  41. case "e":
  42. scanner.close();
  43. loop=false;
  44. break;
  45. default:
  46. break;
  47. }
  48. }
  49. System.out.println("程序退出");
  50. }
  51. }

2、运行结果

图片.png

问题:

当front和rear不断的往后移,导致数组满后再删除数据,之后无法在增加数据,也就是说数组模拟出来的队列是一次性的。
图片.png

解决方法:

通过将数组变成环形数据,问题可以得到解决。

3、总结

队列是一个有序列表,可以用数组或是链表来实现。
遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出

思路分析:
将尾指针往后移:rear+1 , 当front == rear 【空】
若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear所指的数组元素中,否则无法存入数据。
rear == maxSize - 1[队列满]