数据结构之队列

有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)

核心算法思想

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

算法实现

链队列存储结构:

typedef struct qnode
{int data;struct qnode *next;
} QNode;                        //链队节点类型
typedef struct
{QNode *front, *rear;
} QuType;                       //链队类型

创建空队列:

Status InitQueue (LinkQueue &Q) {// 构造一个空队列Q,队头指针和队尾指针都指向头结点)Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if (!Q.front) exit (OVERFLOW);  //存储分配失败Q.front->next = NULL;return OK;
}

入队:

Status EnQueue (LinkQueue &Q, QElemType e)
{ // 插入元素e为Q的新队尾元素p = (QueuePtr) malloc (sizeof (QNode));     //生成新结点if (!p)  exit (OVERFLOW);          //存储分配失败p->data = e;   p->next = NULL;   //插入队尾Q.rear->next = p; Q.rear = p;                          //修改队尾指针指向队尾return OK;
}

出队:

Status DeQueue (LinkQueue &Q, QElemType &e)
{ // 若队列不空,则删除Q的队头元素,用 e 返回其值if (Q.front == Q.rear)    return ERROR;   //判空p = Q.front->next;   e = p->data;         //用e返回队头元素值Q.front->next = p->next;  //修改头指针始终指向队首元素if (Q.rear == p)  Q.rear = Q.front;  //特殊情况处理空队free (p);                       //释放队首结点return OK;
}

实践出真知,代码案例

编写一个程序,实现链队的各种基本运算(假设队列中元素类型为char),并在此基础上设计一个程序完成如下功能:
(1)初始化链队q;
(2)判断链队q是否非空;
(3)依次进队元素a,b,c;
(4)出队一个元素,输出该元素;
(5)依次进链队元素d,e,f;
(6)输出出队序列;
(7)释放链队。

案例源码

#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct qnode
{ElemType data;struct qnode *next;
} QNode;
typedef struct
{QNode *front;QNode *rear;
} LiQueue;
void InitQueue(LiQueue *&q);
void DestroyQueue(LiQueue *&q);
bool QueueEmpty(LiQueue *q);
void enQueue(LiQueue *&q, ElemType e);
bool deQueue(LiQueue *&q, ElemType &e);void InitQueue(LiQueue *&q)  //初始化队列
{q = (LiQueue *)malloc(sizeof(LiQueue));q->front = q->rear = NULL;
}
void DestroyQueue(LiQueue *&q)  //销毁队列
{QNode *p = q->front, *r;   //p指向队头数据节点if (p != NULL)          //释放数据节点占用空间{r = p->next;while (r != NULL){free(p);p = r; r = p->next;}}free(p);free(q);              //释放链队节点占用空间
}
bool QueueEmpty(LiQueue *q) //判断队列是否为空
{return(q->rear == NULL);
}
void enQueue(LiQueue *&q, ElemType e)   //进队
{QNode *p;p = (QNode *)malloc(sizeof(QNode));p->data = e;p->next = NULL;if (q->rear == NULL)      //若链队为空,则新节点是队首节点又是队尾节点q->front = q->rear = p;else{q->rear->next = p;    //将*p节点链到队尾,并将rear指向它q->rear = p;}
}
bool deQueue(LiQueue *&q, ElemType &e)  //出队
{QNode *t;if (q->rear == NULL)     //队列为空return false;t = q->front;                //t指向第一个数据节点if (q->front == q->rear)  //队列中只有一个节点时q->front = q->rear = NULL;else                    //队列中有多个节点时q->front = q->front->next;e = t->data;free(t);return true;
}int main()
{ElemType e;LiQueue *q;printf("链队的基本运算如下:\n");printf("  (1)初始化链队q\n");InitQueue(q);printf("  (2)依次进链队元素a,b,c\n");enQueue(q, 'a');enQueue(q, 'b');enQueue(q, 'c');printf("  (3)链队为%s\n", (QueueEmpty(q) ? "空" : "非空"));if (deQueue(q, e) == 0)printf("\t提示:队空,不能出队\n");elseprintf("  (4)出队一个元素%c\n", e);printf("  (5)依次进链队元素d,e,f\n");enQueue(q, 'd');enQueue(q, 'e');enQueue(q, 'f');printf("  (6)出链队序列:");while (!QueueEmpty(q)){deQueue(q, e);printf("%c ", e);}printf("\n");printf("  (7)释放链队\n");DestroyQueue(q);return 0;
}

编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队过程中,主要重复两件事:
(1)病人到达诊室,将病历本交给护士,排到等待队列中侯诊。
(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。
要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:
(1) 排队–输入排队病人的病历号,加入到病人排队队列中。
(2) 就诊–病人排队队列中最前面的病人就诊,并将其从队列中删除。
(3) 查看排队–从队首到队尾列出所有的排队病人的病历号。
(4) 不再排队,余下依次就诊–从队首到队尾列出所有的排队病人的病历号,并退出运行。

#include <stdio.h>
#include <malloc.h>
typedef struct qnode
{int data;struct qnode *next;
} QNode;            /*链队结点类型*/typedef struct
{QNode *front,*rear;
} QuType;           /*链队类型*/void SeeDoctor()
{int sel,flag=1,find,no;QuType *qu;QNode *p;QNode *q; qu=(QuType *)malloc(sizeof(QuType));    /*创建空队*/qu->front=qu->rear=NULL;while (flag==1)                             /*循环执行*/{printf("1:排队 2:就诊 3:查看排队 4.不再排队,余下依次就诊 5:下班  请选择:");scanf("%d",&sel);switch(sel){case 1:printf("  >>输入病历号:");do{scanf("%d",&no);find=0;p=qu->front;while (p!=NULL && !find){if (p->data==no)find=1;elsep=p->next;}if (find)printf("  >>输入的病历号重复,重新输入:");}while (find==1);p=(QNode *)malloc(sizeof(QNode));   /*创建结点*/p->data=no;p->next=NULL;if (qu->rear==NULL)                 /*第一个病人排队*/{qu->front=qu->rear=p;}else{qu->rear->next=p;qu->rear=p; /*将*p结点入队*/}break;case 2:if (qu->front==NULL)                /*队空*/printf("  >>没有排队的病人!\n");else                                /*队不空*/{p=qu->front;printf("  >>病人%d就诊\n",p->data);if (qu->rear==p)            /*只有一个病人排队的情况*/{qu->front=qu->rear=NULL;}elsequ->front=p->next;free(p);}break;case 3:if (qu->front==NULL)            /*队空*/printf("  >>没有排列的病人!\n");else                            /*队不空*/{p=qu->front;printf("  >>排队病人:");while (p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}break;case 4:if (qu->front==NULL)            /*队空*/printf("  >>没有排列的病人!\n");else                            /*队不空*/{p=qu->front;printf("  >>病人按以下顺序就诊:");while (p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}flag=0;                         /*退出*/break;case 5:if (qu->front!=NULL)            /*队不空*/printf("  >>请排队的病人明天就医!\n");flag=0;                     /*退出*/break;}}p=qu->front;  //销毁队列while (p!=NULL){q = p->next;free(p);p = q;}
}int main()
{SeeDoctor();return 0;
}

大一新生必看,自学必看,里昂详解数据结构之队列相关推荐

  1. 大一新生必看,自学必看,里昂详解数据结构之二叉树

    数据结构之二叉树 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思 ...

  2. 大一新生必看,自学必看,里昂详解数据结构之图

    数据结构之图 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  3. 大一新生必看,自学必看,里昂详解数据结构之链表

    数据结构之链表 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  4. 大一新生必看,自学必看,里昂详解数据结构之线性表

    数据结构之线性表(顺序表) 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) ...

  5. 大一新生必看,自学必看,里昂详解数据结构之堆栈

    数据结构之堆栈 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  6. 大一新生上手题(题目加源代码详解)(每日一题,一题多解)

    2019 数列有序! Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序.n从键盘输 ...

  7. 思科ccna认证工程师必看路由协议IGRP和EIGRP详解

    思科ccna认证工程师必看路由协议IGRP和EIGRP详解单单从他们的名字当中,我们就能猜到他们之间有很多的关联. IGRP: 一种内部网关路由协议,它由Cisco公司八十年代中期设计.使用组合用户配 ...

  8. 一看就懂的CE-NET详解

    一看就懂的CE-NET详解 针对问题 u-net及其变体存在限制,连续的pooling和交错的卷积运算会导致一些空间信息的丢失. 文章贡献 提出了一个DAC模块和一个RMP模块来捕获更多的高级特征并保 ...

  9. 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章

    7.IDE Primary Master UDMA(第一个IDE主控制器下的UDMA模式) 8.IDE Primary Slave UDMA(第一个IDE从控制器下的UDMA模式) 9.IDE Sec ...

最新文章

  1. composer爆错:zlib_decode():data error
  2. Restful与webService区别
  3. python 一些函数语法中参数用中括号([])和逗号(,)嵌套表示是何种含义?可选参数
  4. CTF Geek Challenge——第十一届极客大挑战Misc Write Up
  5. 漫游Kafka实现篇之消息和日志
  6. 可能存在无限递归_无限分类递归+排序解剖
  7. 频率学派还是贝叶斯学派?聊一聊机器学习中的MLE和MAP
  8. Immutable 操作在 React 中的实践
  9. PHP 解决未定义变量报错
  10. 孙鑫VC学习笔记:第二十讲 (一) Hook编程
  11. c语言量程程序,量程自动切换数字电压表c语言原程序
  12. 赚外快—常见编程接单的网站集合(20余个)
  13. Linux 交叉编译工具链
  14. iredmail邮件服务器安装流程
  15. 如何用unity做一个合成图片的程序
  16. O3-开源框架使用之Butterknife 8.8.1及源码浅析
  17. 【QQ农场两周年】回想我的农场
  18. 《人机交互技术》结课作业:界面调研报告交互界面设计快速原型设计(华科软院)
  19. RT_Thread_空闲线程
  20. html5 移动游戏,HTML5移动游戏时代到来了!

热门文章

  1. 如何录制音频文件mp3?给你推荐好用的几款音频录制软件
  2. Java ffmpeg视频压缩IOS播放没有声音问题解决(超级简单)
  3. python图像算法,Zhang-Suen 图像细化算法python实现
  4. 基于FOC电路低次谐波抑制Simulink仿真
  5. C++字符串操作函数strstr,strcmp,strlen,strcpy,strcat,strok
  6. BGP简介-如何配置 EBGP(外部 BGP)
  7. 日语中电脑发出奇怪的声音是如何表达的
  8. 怎么将图片压缩到50k以内?教你一招将图片缩小的方法
  9. 做专业领域领航者 佳能正式推出了Professional Print Layout打印软件
  10. html5+css3界面设计,仿微信支付设计数字键盘