简明易懂的算法文章-了解队列的数据结构

(翻译文)
    在本教程中,您将了解队列是什么。此外,您还可以在java中找到队列的实现。
    队列是编程中一种有用的数据结构。这类似于电影院大厅外的售票队列,第一个进入队列的人是第一个拿到票的人。
    队列遵循先进先出(FIFO)规则-先进入的项目也是先出来的项目。
在这里插入图片描述
    在上图中,由于1在2之前保留在队列中,因此它也是第一个从队列中删除的队列。它遵循FIFO规则。
    用编程术语来说,将项目放入队列称为“入队”,而将项目从队列中删除则称为“出队”。
    我们可以使用任何编程语言(例如C,C ++,Java,Python或C#)来实现队列,但是规范几乎是相同的。

队列的基本操作

队列是一个对象,或更具体地说,是一个允许执行以下操作的抽象数据结构(ADT):

  • Enqueue:将元素添加到队列的末尾
  • Dequeue:从队列的前面删除一个元素
  • IsEmpty:检查队列是否为空
  • IsFull:检查队列是否已满
  • Peek:获取队列最前面的值而不删除它

队列工作

队列操作如下:

  • 两个指针 FRONT 和 REAR
  • FRONT 指向队列的第一个元素
  • REAR 指向队列的最后一个元素
  • 最初,将 FRONT 和 REAR 的值设置为-1
入队操作
  • 检查队列是否已满
  • 对于第一个元素,设置 FRONT 为0
  • REAR 索引增加1
  • 在 REAR 指向的位置添加新元素
出队操作
  • 检查队列是否为空
  • 返回 FRONT 所指的值
  • FRONT 的索引增加1
  • 对于最后一个元素,重置 FRONT 和 REAR 的值为 -1
    在这里插入图片描述

Java中的队列实现

    最常见的队列实现是使用数组,但是也可以使用列表来实现。

// Queue implementation in Java

public class Queue {
    
    
  int SIZE = 5;
  int items[] = new int[SIZE];
  int front, rear;

  Queue() {
    
    
    front = -1;
    rear = -1;
  }

  boolean isFull() {
    
    
    if (front == 0 && rear == SIZE - 1) {
    
    
      return true;
    }
    return false;
  }

  boolean isEmpty() {
    
    
    if (front == -1)
      return true;
    else
      return false;
  }

  void enQueue(int element) {
    
    
    if (isFull()) {
    
    
      System.out.println("Queue is full");
    } else {
    
    
      if (front == -1)
        front = 0;
      rear++;
      items[rear] = element;
      System.out.println("Inserted " + element);
    }
  }

  int deQueue() {
    
    
    int element;
    if (isEmpty()) {
    
    
      System.out.println("Queue is empty");
      return (-1);
    } else {
    
    
      element = items[front];
      if (front >= rear) {
    
    
        front = -1;
        rear = -1;
      } /* Q has only one element, so we reset the queue after deleting it. */
      else {
    
    
        front++;
      }
      System.out.println("Deleted -> " + element);
      return (element);
    }
  }

  void display() {
    
    
    /* Function to display elements of Queue */
    int i;
    if (isEmpty()) {
    
    
      System.out.println("Empty Queue");
    } else {
    
    
      System.out.println("\nFront index-> " + front);
      System.out.println("Items -> ");
      for (i = front; i <= rear; i++)
        System.out.print(items[i] + "  ");

      System.out.println("\nRear index-> " + rear);
    }
  }

  public static void main(String[] args) {
    
    
    Queue q = new Queue();

    // deQueue is not possible on empty queue
    q.deQueue();

    // enQueue 5 elements
    q.enQueue(1);
    q.enQueue(2);
    q.enQueue(3);
    q.enQueue(4);
    q.enQueue(5);

    // 6th element can't be added to queue because queue is full
    q.enQueue(6);

    q.display();

    // deQueue removes element entered first i.e. 1
    q.deQueue();

    // Now we have just 4 elements
    q.display();

  }
}

    运行结果如下:

Queue is empty
Inserted 1
Inserted 2
Inserted 3
Inserted 4
Inserted 5
Queue is full

Front index-> 0
Items -> 
1  2  3  4  5  
Rear index-> 4
Deleted -> 1

Front index-> 1
Items -> 
2  3  4  5  
Rear index-> 4

队列限制

    如您在下图中所看到的,经过一些入队和出队后,队列的大小已减小。
在这里插入图片描述
    只有当所有元素都已出队后,才能在重置队列后使用索引0和1。
    在 REAR 到达最后一个索引,如果我们可以在多余的空间(0和1)中存储多余的元素,则可以利用这些空白。这是由一个称为循环队列的修改队列实现的。

复杂度分析

    使用数组的队列中入队和出队操作的复杂度为O(1)。

队列数据结构的应用

  • CPU调度,磁盘调度
  • 在两个进程之间异步传输数据时。队列用于同步。例如:IO缓冲区,管道,文件IO等
  • 实时系统中的中断处理。
  • 呼叫中心电话系统使用队列来使人们按顺序呼叫

参考文档

https://www.programiz.com/dsa/queue

猜你喜欢

转载自blog.csdn.net/zsx0728/article/details/109534879