队列

https://github.com/toyranger/DataStructureAlgorithm.git

1. 什么是队列

先进先出
可以使用数组或者链表来实现


image.png

front 队列头,随着数据输出而改变
rear队列尾,随着数据输入而改变

2. 数组模拟队列

addQueue

  1. 将rear向后移动,rear + 1,当front == rear时队列为空
  2. 若rear小于maxSize - 1,则将数据存入rear所指向的元素位置,否则无法存入数据,rear = maxSize - 1为队列满
    rear 是队列最后(含)
    front是队列最前元素(不含)
package com.ds.queue;

public class ArrayQueue {

  private int maxSize;
  private int front;
  private int rear;
  private int[] arr; //数组用于存放数据,模拟队列

  /***
   * 构造器
   * @param queueSize
   */
  public ArrayQueue(int queueSize) {
    maxSize = queueSize;
    arr = new int[queueSize];
    front = -1;
    rear = -1;
  }

  /***
   * 判满
   * @return
   */
  public boolean isFull() {

    return rear == maxSize - 1;
  }

  /***
   * 判空
   * @return
   */
  public boolean isEmpty() {
    return front == rear;
  }

  /***
   * 添加元素
   * @param elem
   */
  public void addElemToQueue(int elem) {

//    判断是否满
    if (isFull()) {
      System.out.println("队列满。");
      return;
    }

    rear++;
    arr[rear] = elem;
  }

  /***
   * 取数据
   * @return
   */
  public int getElemFromQueue() {

//    判空
    if (isEmpty()) {
//      这里不抛异常的话,不知道怎么处理return
      throw new RuntimeException("队列空");
    }

    front++;
    return arr[front];

  }

  /***
   * 打印队列
   */
  public void printQueue() {

   if (isEmpty()) {
            System.out.println("队列空的,没有数据~~");
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("arr[%d]=%d\n", i, arr[i]);
        }

  }

  /***
   * 显示队列头数据
   * @return
   */
  public int getHeader() {

    return arr[front + 1];
  }
}

测试代码:

package com.ds.queue;

import java.util.Scanner;

public class Test {

  public static void main(String[] args) {

    ArrayQueue arrayQueue = new ArrayQueue(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): 查看队列头数据");
      System.out.println("-------------------------");

      key = scanner.next().charAt(0); // 接收第一个字符
      switch (key) {
        case 's':
          arrayQueue.printQueue();
          break;
        case 'a':
          System.out.println("输入一个数:");
          int anInt = scanner.nextInt();
          arrayQueue.addElemToQueue(anInt);
          break;
        case 'g':
          try {
            int res = arrayQueue.getElemFromQueue();
            System.out.printf("取出的数是:%d\t", res);
          } catch (Exception e) {
            System.out.println(e);
          }
          break;
        case 'h':
          try {
            int header = arrayQueue.getHeader();
            System.out.printf("队列头是: %d\t", header);
          } catch (Exception e) {
            System.out.println(e);
          }
          break;
        default:
          break;
      }
    }
  }
}

这样写并不合理,因为即使取出数据,实际上数组的空间还是被占用的,优化成环形队列可以解决空间浪费的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 队列 队列的基本概念 队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除;向队列中插入元...
    ribose阅读 624评论 0 2
  • 数据结构 第7讲 循环队列 过了一段时间,小张再也受不了...
    rainchxy阅读 9,106评论 4 16
  • 一、栈 1.1 栈的定义 栈(Stack):只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这...
    末雨潮声阅读 682评论 0 0
  • 1.数据结构包括:线性结构和非线性结构 1.1线性结构 线性结构为最常用的数据结构,其特点是数据元素之间存在一对一...
    smallmartial阅读 467评论 0 0
  • 栈 栈的英文单词是Stack,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入,...
    Jack921阅读 1,523评论 0 5