1.2 队列

  • 基本介绍

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

  • public class ArrayQueueDemo {
      public static void main(String[] args) {
          ArrayQueue arrayQueue = new ArrayQueue(5);
          char key;
          Scanner scanner = new Scanner(System.in);
          a:while (true) {
              try {
                  System.out.println("q:退出程序");
                  System.out.println("s:查看队列");
                  System.out.println("a:向队列中加值");
                  System.out.println("g:从队列中取值");
                  System.out.println("h:查看队首元素");
                  key = scanner.next().charAt(0);
                  switch (key) {
                      case 's':
                          arrayQueue.showQueue();
                          break;
                      case 'a':
                          System.out.println("输入一个值");
                          arrayQueue.addQueue(scanner.nextInt());
                          break;
                      case 'g':
                          System.out.println("从队列中取出的值为" + arrayQueue.getQueue());
                          break;
                      case 'h':
                          System.out.println("队首元素为" + arrayQueue.queueHead());
                          break;
                      case 'q':
                          scanner.close();
                          System.out.println("退出程序");
                          break a;
                      default:
                          System.out.println("命令错误");
                  }
              } catch (Exception e) {
                  System.out.println(e.getMessage());
              }
          }
      }
    }
    class ArrayQueue {
    
      private int maxSize; // 队列的最大容量
    
      private int front; // 队列头指针 指向队列头的前一个位置
    
      private int rear; // 队列尾指针 指向队列的最后一个位置
    
      private int[] array; // 数组
    
      public ArrayQueue(int arrayMaxSize) {
          // 初始化队列
          this.maxSize = arrayMaxSize;
          this.array = new int[maxSize];
          this.front = -1; // 指向队列头的前一个位置
          this.rear = -1; // 指向队列的最后一个位置
      }
    
      public boolean isFull() {
          return rear == maxSize - 1; // 判断队列是否已满
      }
    
      public boolean isEmpty() {
          return front == rear; // 判断队列是否为空
      }
    
      public void addQueue(int value) {
          if (this.isFull()) {
              throw new RuntimeException("队列已满");
          }
          this.rear++;// 赋值必须先加后用
          array[this.rear] = value;
      }
    
      public int getQueue() {
          if (this.isEmpty()) {
              throw new RuntimeException("队列为空");
          }
          this.front++; // 取值必须先加后用
          return array[this.front];
      }
    
      public void showQueue() {
          if (this.isEmpty()) {
              throw new RuntimeException("队列为空");
          }
          for (int i = this.front + 1; i <= this.rear; i++) {
              System.out.printf("arr[%d]=%d\t\n", i, this.array[i]); // 显示队列中的数据
          }
      }
    
      public int queueHead() {
          if (this.isEmpty()) {
              throw new RuntimeException("队列为空");
          }
          return this.array[front + 1]; // 显示队首元素 不能使用++ 不改变队首指针
      }
    }
    
  • 存在的问题

    • 目前数组使用一次就不能用, 没有达到复用的效果
    • 将这个数组使用算法,改进成一个列 环形的队列 取模:%
posted @ 2020-08-27 17:47  xiaokantianse  阅读(51)  评论(0编辑  收藏  举报