目录

一:队列的表示和操作的实现

1.1 队列的示意图

1.2  队列的介绍

1.3:相关概念

1.4 实际生活中的实例

二:队列的抽象数据结构和 操作代码

2.1 抽象的数据结构

2.2 队列的顺序表示和实现 (分析和思考)

2.2.1 顺序队列的数据结构

2.2.2 顺序队列的入队和出队 图示:

​编辑​编辑

2.2.3 溢出思考:

2.3循环队列的表示和实现

2.3.1 循环队列的类型定义

2.3.2 循环队列的初始化

2.3.3 循环队列的求队列长度

2.3.4 循环队列入队

2.3.5  循环对列的出队

2.3.6 取队头元素

2.4:链队的表示和实现

关于链队的一些重点

2:链式队列的表示和基本操作

实例练习:行排队叫号系统



一:队列的表示和操作的实现

1.1 队列的示意图

 类似:排队 滴水漏斗

1.2  队列的介绍

  • 队列(Queue)是仅在表尾进行插入操作,在表头进行删除操作的线性表
  • 表尾即an端,称为队尾; 表头即a1端,称为队头。
  • 它是一种先进先出( FIFO )的线性表。

  • 插入元素称为人队;删除元素称为出队。
  • 队列的存储结构为链队或顺序队(常用循环顺序队)

1.3:相关概念

逻辑结构:同线性表 一一对应关系

存储结构:顺序和链队,循环队列最常见

运算规则:只在队首和队尾运算,先进先出FIFO原则

实现方式:入队和出队等重要实现方式

1.4 实际生活中的实例

■脱机打印输出:按申请的先后顺序依次输出。
■多用户系统中,多个用户排成队,分时地循环使用CPU和主存
■按用户的优先级排成多个队,每个优先级一个队列
■实时控制系统中,信号按接收的先后顺序依次处理

二:队列的抽象数据结构和 操作代码

2.1 抽象的数据结构

2.2 队列的顺序表示和实现 (分析和思考)

2.2.1 顺序队列的数据结构

#define MAXQSIZE 100 //最大队列长度

typedef struct{

QElemType *base;//初始化的动态分配存储空间

int front;// 头指针

int rear; //尾指针

}SqQueue;

2.2.2 顺序队列的入队和出队 图示:

2.2.3 溢出思考:

数组大小为MAXQSIZE

rear = MAXQSIZE    front !=0 再入队,发生假溢出

rear =MAXQSIZE      front = 0 再入队,发生真溢出

如何解决假上溢? 循环队列

解决方法:

继续解决:队满判断方法

2.3循环队列的表示和实现

2.3.1 循环队列的类型定义

#define MAXQSIZE 100 //最大队列长度

typedef struct{

QElemType *base;//初始化的动态分配存储空间

int front;// 头指针

int rear; //尾指针

}SqQueue;

2.3.2 循环队列的初始化

Status InitQueue(SqQueue &Q){

Q.base = (QElemType*)malloc(sizeof(QElemType));//分配数组空间

if(!Q.base) exit(OVERFLOW); //存储分配失败

Q.front =Q.rear =0;// 头指针置为 0 队列为空

return OK;

}

2.3.3 循环队列的求队列长度

int QueueLengh(SqQueue Q){

return ((Q.rear-Q.front+MAXSIZE)%MAXSIZE);

}

2.3.4 循环队列入队

Status EnQueue(SqQueue &Q,QElemType e){

if((Q.rear+1)%MAXSIZE==Q.front) return ERROR; //队满

Q.base[Q.rear]=e; //新元素入队尾

Q.rear = (Q.rear+1)%MAXSIZE; //队尾指针+1

return OK;

}

2.3.5  循环对列的出队

Status DeQueue(SqQueue &Q,QElemType &e){

if(Q.rear==Q.front) return ERROR; //队空

e = Q.base[Q.rear]; //新元素入队尾

Q.front = (Q.front+1)%MAXSIZE; //队尾指针+1

return OK;

}

2.3.6 取队头元素

SElemType GetHead(SqQueue Q){

if(Q.front!=Q.rear)// 队列不为空

return Q.base[Q.front]; // 返回对头指针元素的值 队头指针不变

}

2.4:链队的表示和实现

关于链队的一些重点

1:链队(链式队列)和循环队列(顺序队式)是队列的不同的表示方式。那么什么时候使用队列什么时候使用链队?

若用户无法估计所用队列的长度,则宜采用链队列

2:链队和栈链的不同?

链队先进先出(FIFO)和栈链后进先出(LILO),类比银行排队(链队),弹夹子弹出膛(栈链)

3:链队和栈链的相似之处

栈和队列是限定插入和删除只能在表的"端点”进行的线性表

2:链式队列的表示和基本操作

链式队列的表示

(Q.front指向头结点,Q.rear指向尾结点)

心中有图 撸码自然神

一:链队的类型表示:

typedef int Status;

typedef int QElemType;

typedef struct Qnode{ //创建节点类型= data数据域+*next指针域

QElemType data;

struct Qnode *next;

}QNode,*QueuePtr;//别名

//补:  *QueuePtr指向该节点的指针类型

//引:所以Q.front是什么类型 ,有什么用?

//Q代表什么?

typedef struct{

QueuePtr front;

QueuePtr rear

}LinkQueue;//由两个结构体指针组成了链式队列

二:链队列的指针变化状况

基本操作的本质就是不同指针的不同变化状况

心中有图 撸码自然神

三:链队的操作

1 初始化

Status initQueue(LinkQueue &Q){

Q.front=Q.rear=(QueuePtr*)malloc(sizeof(QNode));

// 或者Q.front=Q.rear=new QNode;

Q.front->next=NULL;

return OK;

}

2 链队的销毁

Status DestroyQueue(LinkQueue &Q){
    while(Q.front){

QueuePtr p;
        p=Q.front->next;
        free(Q.front);
        Q.front=p;
    }
    return OK;
}

3 链队列入队

Status EnLinkQueue(LinkQueue &Q,QElemType e){
    QNode *p=new QNode;//或者p=(QueuePtr)malloc(sizeof(QNode));
    if(!p)exit(OVERFLOW);
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return OK;
}

4:链队列出队

 在头结点上操作

Status DeLinkQueue(LinkQueue &Q,QElemType &e){
    if(Q.front==Q.rear)return ERROR;
   // QNode *p=new QNode;
     QueuePtr p;
    p=  Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)
        Q.rear=Q.front;
    delete p;
    return OK;
}

5:算链队列的对头元素

了解队头是:Q.front还是Q.front->next?

Q.front:头结点 || Q.front->next :队头元素x 所以:对头元素x在头结点的下一位置上

Status GetHead(LinkQueue &Q,QElemType &e){
    if(Q.front==Q.rear)return ERROR;
    e=Q.front->next->data;
    return OK;    
}

实例练习:行排队叫号系统

编写程序实现银行排队叫号系统,采用链队列作为存储结构。

//编写程序实现银行排队叫号系统,采用链队列作为存储结构。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define MAX_QSIZE 30
typedef int Status;
typedef int QElemType;
typedef struct Qnode
{
    QElemType data;
    struct Qnode * next;
}QNode, *QueuePtr;//创建节点类型
typedef  struct Queue{
  QueuePtr   front ; //队首指针
  QueuePtr   rear ; //队尾指针
  }LinkQueue;
Status InitLinkQueue(LinkQueue &Q);//对链队列进行初始化
Status EnLinkQueue(LinkQueue &Q,QElemType e);//入队
Status DeLinkQueue(LinkQueue &Q,QElemType &e);//出队
Status QueueEmpty(LinkQueue Q);//判断队空

/* 请在这里填写答案 */
Status InitLinkQueue(LinkQueue &Q){
    Q.front =Q.rear =(QNode*)malloc(sizeof(QNode));
    Q.front->next= NULL;
    return OK;
}
Status EnLinkQueue(LinkQueue &Q,QElemType e){
    QNode *p=new QNode;
    if(!p)exit(OVERFLOW);
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return OK;
}
Status DeLinkQueue(LinkQueue &Q,QElemType &e){
    if(Q.front==Q.rear)return ERROR;
   // QNode *p=new QNode;
       QueuePtr p;
    p=  Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)
        Q.rear=Q.front;
    delete p;
    return OK;
}
int main()
{
    QElemType no=1;
    QElemType callno;
    int select,flag=1;
    LinkQueue qu;
    InitLinkQueue(qu);
    while(flag==1)
    {
        //printf("1:排队2:叫号0:退出 请选择:");
        scanf("%d",&select);
        switch(select)
        {
        case 1: printf("您的序号为:%d\n",no);
                EnLinkQueue(qu,no);  //no入队
                no++;
                break;
        case 2: if(DeLinkQueue(qu,callno)==ERROR)
                    printf(">>没有排队的客户!\n");
            else//队不空
                printf(">>请%d号办理业务\n",callno);
                break;
        case 0:flag=0;
        }
    }
    return 0;
}

(史上最完整) 队列 的基本操作和实现 及排队系统实例相关推荐

  1. ML之FE:利用【数据分析+数据处理】算法对国内某平台上海2020年6月份房价数据集【12+1】进行特征工程处理(史上最完整,建议收藏)

    ML之FE:利用[数据分析+数据处理]算法对国内某平台上海2020年6月份房价数据集[12+1]进行特征工程处理(史上最完整,建议收藏) 目录 利用[数据分析+数据处理]算法对链家房价数据集[12+1 ...

  2. 史上最完整的文件和目录操作类

    [文件操作类]史上最完整的文件和目录操作类 <a target=_blank href="http://bbs.cskin.net/thread-114-1-1.html"& ...

  3. 终于把单点登录完整流程图画明白了!史上最完整的CAS单点登录完整图解!

    CAS单点登录 本人也是初次接触CAS,有问题还请指正. 什么是单点登录 比如说百度,在浏览器中登录百度贴吧之后,百度的其他网站也同步登录了:退出百度贴吧之后,百度的其他网站也同步退出了. 简单来说就 ...

  4. php编写六十甲子纳音表_史上最完整的六十甲子纳音表详细说明

    六十甲子是汉族人民最早和最大的发明,其历史已有上千年,其用途是纪年.纪月.纪日.纪时.在古时候,就是我们的时钟,以六十年为一个周期,纪月为五年一个周期,纪日为六十天一个周期,纪时为五天一个周期.接下来 ...

  5. 史上最完整的5G NR介绍

    史上最完整的5G NR介绍 目录 史上最完整的5G NR介绍 5G部署选项 5G NR频谱 5G NR物理层 5G部署选项 一说到"部署选项"这事,说实话,我觉得自己有点" ...

  6. poi操作ppt图表史上最完整示例演示

    poi操作ppt图表史上最完整示例演示和内嵌excel的获取添加数据简单示例 ,POI3.15版本. 在模板中构造几中基本图表进行测试就行了. 完整下载地址:http://download.csdn. ...

  7. 史上最完整的2012(2011年度)SCI(SSCI)影响因子

    史上最完整的2012(2011年度)SCI(SSCI)影响因子 (1)按因子if大小排序的版本 按if排序的版本.xls (2)2012年(2011年度)按学科领域细分 按学科细分.xls (3)各种 ...

  8. 史上最完整交互设计基本原则|推荐收藏

    史上最完整交互设计基本原则|推荐收藏 人人都是产品经理 •  2 小时前 摘要:如何设计出具有优秀用户体验的产品是交互设计师始终面临的一道难题,"好的产品设计一定是建立在对用户需求的深刻理解 ...

  9. 史上最完整的MySQL注入 1

    作者:Passerby2 原文来自:史上最完整的MySQL注入 免责声明:本教程仅用于教育目的,以保护您自己的SQL注释代码. 在阅读本教程后,您必须对任何行动承担全部责任. 0x00 ~ 背景 这篇 ...

最新文章

  1. Xcode_9_beta.xip 更新下载
  2. 1142 CREATE VIEW command denied to user 'blog'@'XXX.XXX.XXX.XXX' for table 'Articles'
  3. DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)...
  4. 二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式
  5. 什么浏览器好用_还在用手机自带浏览器么?这个不足1M的浏览器却功能更加强大...
  6. (王道408考研数据结构)第二章线性表-第二节1:顺序表的定义
  7. Bailian2786 Pell数列【数列】(POJ NOI0102-1788,POJ NOI0103-1788)
  8. maven编译报程序包不存在_Hadoop学习之路(二)Hadoop2.7.5在CentOS6.7上的编译
  9. 添加SAP_ALL权限
  10. java 文件描述符_文件描述符了解一下
  11. 前端地图之色斑图渲染(数据格式为.tif的栅格数据)(一)——以leaflet为例
  12. html5 excel网页版,一种网页版EXCEL的实现方法与流程
  13. oracle 汉字转五笔码,芈月传的芈字怎么打?用五笔拆解并输入方法图解
  14. Android文件系统编译出错记录
  15. matlab画空间分布图,matlab空间图形的画法.doc
  16. 神经网络发展历史时间统计表(留存收藏)
  17. python读取txt文档乱码解决
  18. CentOS 基础命令 III
  19. 漫画版的你,离线版AnimeGANv2初体验
  20. 华为暑期实习一面凉经

热门文章

  1. 图解PKCS#1(合)
  2. 扎克伯格:锻造一只硕大无朋的能力“碗”
  3. VB 变量的声明及作用域
  4. 【电路补习笔记】8、稳压电路 —— 线性电源及LDO
  5. 2022年京东双11和天猫双11预售时间介绍
  6. matlab 无穷符号,MATLAB强大的符号运算
  7. 安全防护与信息加密:一个新的挑战
  8. HBase的java代码开发(完整源码)
  9. OpenStack实操用到的网络知识
  10. Learn How Google Works: in Gory Detail