zoukankan      html  css  js  c++  java
  • 数据结构.队列

    一、定义

    队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。

    二、基本概念

    1.允许删除的一端称为队头(Front)。

    2.允许插入的一端称为队尾(Rear)。

    3.当队列中没有元素时称为空队列。

    4.队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。

     队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次
     离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队
    

     1 ///Name:Queue
     2 ///Author:JA
     3 ///Date:2015-3-6
     4 
     5 
     6 
     7 ///单链队列——队列的链式存储结构
     8 typedef  struct QNode{
     9     QElemType data;
    10     struct QNode *next;
    11 
    12 }QNode, *QueuePtr;
    13 typedef struct{
    14     Queue front;         //队头指针
    15     Queue rear;          //队尾指针
    16 }LinkQueue;
    17 
    18 ///基本操作的算法部分
    19 Status InitQueue(LinkQueue *Q){
    20     //构造一个空队列Q
    21     Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    22     if (!Q.front) exit(OVERFLOW);
    23     Q.front->next = NULL;
    24     return OK;
    25 }
    26 
    27 Status DestroyQueue(LinkQueue *Q){
    28     //销毁队列
    29     while (Q.front){
    30         Q.rear = Q.front->next;
    31         free(Q.front);
    32         Q.front = Q.rear;
    33     }
    34     return OK;
    35 }
    36 
    37 Status EnQueue(LinkQueue *Q,QElemType e){
    38     //插入元素e为新的队尾元素
    39     p=(QueuePtr)malloc(sizeof(QNode));
    40     if (!p)exit(OVERFLOW);
    41     p->data = e; p->next = NULL;
    42     Q.rear->next = p; 
    43     Q.rear = p;
    44     return OK;
    45 }
    46 
    47 Status DeQueue(LinkQueue *Q,QElemType &e){
    48     //若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK
    49     //否则返回ERROR
    50     if (Q.front = Q.rear) return ERROR;
    51     p = Q.front->next;
    52     e = p->data;
    53     Q.front->next = p->next;
    54     if (Q.rear == p) Q.rear = Q.front;
    55     free(p);
    56     return    OK;
    57 }
    View Code

    三、队列的应用

    1.CPU资源的竞争问题。在具有多个终端的计算机系统中,有多个用户需要使用CPU各自运行自己的程序,它们分别通过各自终端向操作系统提出使用CPU的请求,操作系统按照每个请求在时间上的先后顺序,将其排成一个队列,每次把CPU分配给队头用户使用,当相应的程序运行结束,则令其出队,再把CPU分配给新的队头用户,直到所有用户任务处理完毕。

    2.主机与外部设备之间速度不匹配的问题。以主机和打印机为例来说明,主机输出数据给打印机打印,主机输出数据的速度比打印机打印的速度要快得多,若直接把输出的数据送给打印机打印,由于速度不匹配,显然是不行的。所以解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依此写如到这个缓冲区中,写满后就暂停输出,继而去做其它的事情,打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求,主机接到请求后再向缓冲区写入打印数据,这样利用队列既保证了打印数据的正确,又使主机提高了效率。

  • 相关阅读:
    谈谈 OC 中的内联函数
    Spring 新手教程(二) 生命周期和作用域
    实时竞价(RTB) 介绍(基础篇)
    oracle数据库性能优化方案精髓整理收集回想
    HNU 13411 Reverse a Road II(最大流+BFS)经典
    CSS3主要知识点复习总结+HTML5新增标签
    修改默认MYSQL数据库data存放位置
    mysql状态查看 QPS/TPS/缓存命中率查看
    Mysql5.7.10新加用户
    很靠谱linux常用命令
  • 原文地址:https://www.cnblogs.com/joeaaron007/p/4317997.html
Copyright © 2011-2022 走看看