队列

作者: amazing_s10plus | 来源:发表于2019-08-04 23:43 被阅读0次

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;
      }
    }
  }
}

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

相关文章

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 队列

    文章结构 什么是队列 实现队列顺序队列链式队列循环队列 Java中的队列 1. 什么是队列 队列也是一种操作受限的...

  • iOS底层-- GCD源码分析(1)-- dispatch_qu

    手动目录认识队列队列的结构队列的产生主队列全局队列创建的队列管理队列 代码版本dispatch version :...

  • 队列,异步,同步,线程通俗理解

    一、队列 串行队列 并行队列 主队列(只在主线程执行的串行队列) 全局队列(系统的并行队列) 二、 任务(是否具有...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • OC多线程

    队列创建 线程与队列 队列线程间通信 队列组

  • GCD

    获得主队列 获得全局队列 串行队列 异步队列 同步队列 阻隔队列 (像栅栏一样 ) 例如 A -->栅栏 --...

  • 数据结构第三篇 队列

    队列的特性 前进先出。 我们来大致描述下进出队列的情况。 进队列 1 进队列现在队列是 12 进队列现在队列是 1...

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

  • Git 常用操作命令(持续更新)

    当前更新到stash队列 查看stash队列 清空队列 删除某个队列

网友评论

      本文标题:队列

      本文链接:https://www.haomeiwen.com/subject/ujqudctx.html