数据结构基础之队列
2016-02-19 23:20
489 查看
队列是一种先进先出的线性表,只允许在表的一端进行插入,另一端进行删除元素,允许插入的一端称为队头,front,允许删除的一端称为队尾,rear。
顺序循环队列的基本运算如下:
为配对的等待下一轮,算法如下:
![](http://img.blog.csdn.net/20160219231850667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
参考:《数据结构》——陈锐
顺序循环队列的基本运算如下:
#define QueueSize 60 typedef struct Squeue {//定义顺序循环队列,避免"假溢出" DataType queue[QueueSize]; int front,rear; }SeqQueue; void InitQueue(SeqQueue *SCQ) {//初始化 SCQ->front=SCQ->rear=0; } int QueueEmpty(SeqQueue SCQ) {//判断队列是否为空,为空返回1,否则返回0 if(SCQ.front==SCQ.rear) return 1; else return 0; } int EnQueue(SeqQueue *SCQ,DataType e) {//将e插入到顺序循环队列SQ中,成功返回1,否则为0 if(SCQ->front==(SCQ->rear+1)%QueueSize) return 0; SCQ->queue[SCQ->rear]=e; SCQ->rear=(SCQ->rear+1)%QueueSize; return 1; } int DeQueue(Squeue *SCQ,DataType *e) {//将对头元素出对,并赋给e,成功返回1,否则为0,指针回送 if(SCQ->front==SCQ->rear) return 0; else { *e=SCQ->queue[SCQ->front]; SCQ->front=(SCQ->front+1)%QueueSize; //这个表达方式循环特有,相当于是front=front+1,指针后移 return 1; } } int GetHead(Squeue SCQ,DataType *e) {//取对头元素,并将元素赋给e,成功返回1,否则为0 if(SCQ.front==SCQ.rear) return 0; else { *e=SCQ.queue[SCQ.front]; return 1; } } void ClearQueue(SeqQueue *SCQ) {//清空队列 SCQ->front=SCQ->rear=0; }舞会上,男生和女生各排成一队,跳舞开始男生和女生的队头各出一人配成舞伴。如果初始人数不相同,较长那一队中
为配对的等待下一轮,算法如下:
#include"stdio.h" typedef struct { char name[20]; char sex;// 'F'女,‘M’男 }Person; typedef Person DataType; #include"SeqQueue.h" int DancerCount(SeqQueue Q); void DancePartner(DataType dancer[],int num) { int i; DataType p; SeqQueue Mdancers,Fdancers; InitQueue(&Mdancers); InitQueue(&Fdancers); for(i=0;i<num;i++) //入队 { p=dancer[i]; if(p.sex=='F') EnQueue(&Fdancers,p); else EnQueue(&Mdancers,p); } printf("配对成功的舞伴是:\n"); while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers)) { DeQueue(&Fdancers,&p);//女士出队 printf("%s ",p.name); DeQueue(&Mdancers,&p);//男士出队 printf("%s\n ",p.name); } if(!QueueEmpty(Fdancers)) { printf("还有%d个女生剩下\n",DancerCount(Fdancers)); GetHead(Fdancers,&p); printf("%s将在下一轮中先得到舞伴",p.name); } else if(!QueueEmpty(Mdancers)) { printf("还有%d个男生剩下\n",DancerCount(Mdancers)); GetHead(Mdancers,&p); printf("%s将在下一轮中先得到舞伴",p.name); } } int DancerCount(SeqQueue Q) { return (Q.rear-Q.front+QueueSize)%QueueSize; } void main() { int i,n; DataType dancer[30]; printf("舞池中排队人数:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("姓名:"); scanf("%s",&dancer[i].name); getchar(); printf("性别:"); scanf("%c",&dancer[i].sex); } DancePartner(dancer,n); }执行结果如下:
参考:《数据结构》——陈锐
相关文章推荐
- MySQL索引背后的数据结构及算法原理
- nginx源码初读(2)--让烦恼从数据结构开始(ngx_buf/ngx_chain)
- 数据结构与算法——图
- poj 1451(Trie)
- iOS学习_Lesson01_数据结构
- 关于VFS文件系统中的superblock、inode、d_entry和file数据结构
- Redis中5种数据结构的使用场景介绍
- Redis中5种数据结构的使用场景介绍
- 《数据结构与算法分析(c 描述)》—— 第二章笔记
- 数据结构之栈(四)
- HDU 5479 Scaena Felix(简单的数据结构题目)
- 《数据结构与算法分析(c 描述)》—— 第一章笔记
- c++ 数据结构 哈夫曼树
- poj 1195(二维树状数组)
- 数据结构实验之二叉树三:统计叶子数
- 学习笔记------数据结构(C语言版)数组之十字链表
- 数据结构---树形结构
- [NOIP2004]合并果子 T2 数据结构 简单贪心
- 数据结构之栈(三)
- C#中使用Redis不同数据结构的内存占有量的疑问和对比测试