首页 > 其他分享 >队列(Queue):先进先出(FIFO)的数据结构

队列(Queue):先进先出(FIFO)的数据结构

时间:2023-11-05 09:11:29浏览次数:45  
标签:queue 链表 队列 元素 FIFO Queue front 先进先出

队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队。这种数据结构模拟了物理世界中的队列,如排队等待服务的人。

在本篇博客中,我们将详细介绍队列的概念、用途、实现以及如何在编程中使用队列。

队列的概念

队列是一个线性数据结构,具有以下关键特点:

  1. 先进先出(FIFO)原则: 最早入队的元素将首先出队。
  2. 两个主要操作: 队列支持两个基本操作,即入队(Enqueue)和出队(Dequeue)。
  3. 队首: 位于队列前端的元素是最早加入队列的元素,是唯一一个可以访问的元素。
  4. 队尾: 位于队列尾端的元素是最新加入队列的元素。
  5. 限制大小: 队列可以有固定或动态大小,通常有容量限制。

队列的用途

队列在计算机科学中有广泛的应用,包括但不限于以下用途:

  1. 任务调度: 操作系统使用队列来管理进程的调度和执行顺序。
  2. 数据缓冲: 队列用于缓存数据,以平衡生产者和消费者之间的速度差异。
  3. 广度优先搜索: 在图算法中,队列用于实现广度优先搜索(BFS)算法。
  4. 打印队列: 打印作业排队以等待打印机执行。
  5. 消息传递: 队列用于消息传递系统,如消息队列(Message Queue)。
  6. Web请求队列: Web服务器使用队列来处理传入请求,以平衡服务器负载。

队列的实现

队列可以通过数组或链表实现。每种实现方式都有其优点和缺点。

  1. 数组实现: 使用数组实现的队列通常具有固定大小,通常更快,因为数组的元素在内存中是连续存储的。然而,固定大小的数组队列可能会导致队列溢出。
  2. 链表实现: 使用链表实现的队列没有固定大小限制,因此更灵活,但在访问队列中的元素时需要遍历链表,性能略低于数组实现。

以下是用Go语言实现的简单队列的示例,使用链表实现:

package main

import (
    "fmt"
)

type Node struct {
    data int
    next *Node
}

type Queue struct {
    front *Node
    rear  *Node
}

func (q *Queue) Enqueue(item int) {
    newNode := &Node{data: item, next: nil}
    if q.front == nil {
        q.front = newNode
        q.rear = newNode
    } else {
        q.rear.next = newNode
        q.rear = newNode
    }
}

func (q *Queue) Dequeue() int {
    if q.front == nil {
        panic("Queue is empty")
    }
    item := q.front.data
    q.front = q.front.next
    return item
}

func main() {
    queue := Queue{}
    queue.Enqueue(1)
    queue.Enqueue(2)
    queue.Enqueue(3)

    fmt.Println(queue.Dequeue()) // 输出 1
    fmt.Println(queue.Dequeue()) // 输出 2
}

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


标签:queue,链表,队列,元素,FIFO,Queue,front,先进先出
From: https://www.cnblogs.com/lianshuiwuyi/p/17810225.html

相关文章

  • Java拾贝第十六天——集合之Queue、Stack
    Queue(队列)Queue是一种先进先出(FIFO:FirstInFirstOut)的有序集合:Queue是Collection的子接口,其定义如下publicinterfaceQueue<E>extendsCollection<E>LinkedList实现了Queue的子接口,根据多态性可以使用Queue创建LinkedList实例。Queue接口常用方法如下:方法类型......
  • Princeton Algorithms, Part I week2 stack&queue
    stack:先进后出queue:先进先出首先是stack有两种实现方式,第一种是用链表,第二种是用数组。Stack:linked-listrepresentation   stack:arrayimplementation  上面这个实现是固定长度的arrayimplementation非常不方便,所以引入可变长度的实现resizing-array......
  • odoo pdf 打印任务后台运行,pdf保存在附件中, 借助queue_job模块实现后台打印
    用户故事:在打印大批量pdf文件时会有较长事件的等待,而且容易中断原因中断原因,有内存及超时限制,wkhtmltopdf工具比较吃内存解决方案:内存限制的问题可以分批处理,比如每次只处理50条记录代码示例,使用按钮触发的打印功能:#model:[email protected]......
  • BlockingQueue---SynchronousQueue
    概述A{@linkplainBlockingQueueblockingqueue}inwhicheachinsertoperationmustwaitforacorrespondingremoveoperationbyanotherthread,andviceversa.Asynchronousqueuedoesnothaveanyinternalcapacity,notevenacapacityofone.......
  • cf353D. Queue(整体考虑转移)
    D.Queuef[i]表示第i个F需要多少时间才能让所有的M都移到她后面,那么我们考虑转移,分为两种情况。第i个F和第i-1个F挨着,那么显然f[i]=f[i-1]+1假如中间隔着一些M,可以分为两种情况,假如i可以在i-1完成之前追上它,那么就是f[i-1]+1,否则就说明i一直在进行交换,时间为在i之前的M的个数......
  • C++---数据结构---队列(queue)
    queue容器queue基本概念概念:Queue是一种先进先出(FirstInFirstOut,FIFO)的数据结构,它有两个出口队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为—入队push队列中出数据称为—出队popque......
  • AQS是什么?AbstractQueuedSynchronizer之AQS原理及源码深度分析
    文章目录一、AQS概述1、什么是AQS2、技术解释3、基本原理4、AQS为什么这么重要二、AQS数据结构1、AQS的结构2、ReentrantLock与AbstractQueuedSynchronizer3、AQS的state变量4、AQS的队列5、AQS的Node(1)Node的waitStatus(2)属性说明三、ReentrantLock的lock方法分析AQS源码1、类图2、......
  • Java队列Queue简述
    概述​ Queue是java中实现队列的接口,它总共只有6个方法,我们一般只用其中3个就可以了。Queue的实现类有LinkedList和PriorityQueue。最常用的实现类是LinkedList。Queue的6个方法分类抛出异常返回特殊值插入add(e)offer(e)删除remove()poll()检查element(......
  • 华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)
    十一、计划任务与Queue队列实践:1.计划任务:Linux环境下定时或者周期性的执行一些任务通常由cron这个守护进程来完成,这是一个系统自带的相对也比较方便的系统工具。sudoapt-getinstallcron//默认自带目录结构:目录说明/var/spool/cron/crontabs用户调度任务目录,是每个用户包括r......
  • 救济金发放(The Dole Queue, UVa 133)
    #include<stdio.h>#include<string.h>#definemaxn100intn,k,m,a[25];intleft,chance;intwin,lose;chars[maxn],s2[maxn];  intgo(intp,intd,intt){ while(t--){  do{    p=(p+d+n-1)%n+1;//将顺时针与逆时针合并,顺时针向前......