队列

简介: 什么是队列?

队列是一个有序列表,可以用数组或是链表来实现。


遵循先入先出的原则。


数组模拟队列



image.png


队列基本概念


数组模拟环形队列



image.png


环形队列思路分析


对前面数组模拟队列的优化,充分利用数组,因此将数组看作是一个环形的。(通过取模的方式来实现)


分析说明:


1)尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个做判断队列满的需要注意


(rear+1)%maxSize==front[满]

rear==front[空]


```java
package DataStructures;
import java.util.Scanner;
public class CircleArrayQueueDemo {
  public static void main(String[]args) {
    //测试
    System.out.println("测试环形队列");
     CircleArray queue = new  CircleArray(4);
    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):查看队列头的数据");
      key = scanner.next().charAt(0);// 接受一个字符
      switch (key) {
      case 's':
        queue.showQueue();
        break;
      case 'a':
        System.out.println("输入一个数");
        int value = scanner.nextInt();
        queue.addQueue(value);
        break;
      case 'g':
        try {
          int res = queue.getQueue();
          System.out.printf("取出的数据是%d\n", res);
        } catch (Exception e) {
          System.out.println(e.getMessage());
        }
        break;
      case 'h':
        try {
          int res=queue.headQueue();
          System.out.printf("取出的队列头数据是%d\n",res);
        } catch (Exception e) {
          System.out.println(e.getMessage());
        }
        break;
      case 'e'://退出
        scanner.close();
        loop=false;
        break;
        default:
        break;
      }
    }
    System.out.println("程序退出--");
  }
  }
class CircleArray{
  private int maxSize;//表示数组的最大容量
  private int front;//队列头:指向队列第一个元素
  private int rear;//队列尾:指向队列最后一个元素的后一个位置
  private int[]arr;//模拟队列
  public CircleArray(int maxSize) {
    this.maxSize=maxSize;
    arr=new int[maxSize];
  }
  //判断队列是否满
  public boolean isFull() {
    return (rear+1)%maxSize==front;
  }
  //判断队列是否为空
  public boolean isEmpty() {
    return rear==front;
  }
  //添加数据
  public void addQueue(int n) {
    //判断是否满
    if(isFull()) {
      System.out.println("队列满,不能添加元素");
      return;
    }
    //直接将数据加入
    arr[rear]=n;
    //将rear后移,这是考虑的取模问题,被除数小于取除数取模就等于被除数本身
    rear=(rear+1)%maxSize;
  }
  //获取队列的数据,出队列
  public int getQueue() {
    if(isEmpty()) {
      //t通过抛出异常
      throw new RuntimeException("队列空,不能取数据");
    }
    //这里需要分析出front是指向队列的第一个元素
    //1.先把front对应的值保存到一个临时的变量
    //2.将front后移
    //3.降临时保存的变量返回
    int value=arr[front];
    front=(front+1)%maxSize;//front++;考虑取模问题 一直加 产生越界
    return value;
  }
  //显示队列所有数据
  public void showQueue() {
    //遍历
    if(isEmpty()) {
      System.out.println("队列空的,没有数据");
      return;
    }
    //从front开始遍历 遍历多少个元素
    for(int i=front;i<front+size();i++) {
      System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
      //i%maxSize 下标为什么时这个呢 因为他是一个循环 找一个循环的第几个就是
      //除以这个循环再取余i有可能比maxSize大
    }
  }
  //求出当前队列有效数据的个数
  public int size() {
    return (rear+maxSize-front)%maxSize;//
  }
  public int headQueue() {
    //判断
    if(isEmpty()) {
      throw new RuntimeException("队列为空,没有数据");
    }
    return arr[front];
  }
}
```



相关文章
|
6月前
|
存储 消息中间件 前端开发
队列
队列
70 0
|
缓存
指令缓存队列
指令缓存队列
67 0
|
6月前
队列的实现
队列的实现
|
11月前
|
C++
c++ 队列
队列的数据结构
36 0
|
机器学习/深度学习 存储 C语言
队列的实现(上)
队列的实现(上)
队列的实现(下)
队列的实现(下)
|
存储
队列的使用
队列的使用
78 0
|
存储
队列?是你了解的这样吗?
队列?是你了解的这样吗?
106 0
队列?是你了解的这样吗?