如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
3.4队列3.4.1队列的定义队列的基本运算:(1)队列初始化:InitQueue(Q)结果:设置一个空队列Q。(2)入队列:EnQueue(Q,x)结果:将x插入到队列Q的队尾。(3)出队列:OutQueue(Q,x)结果:将队头元素赋给x,并删除队头。(4)判队列空:EmptyQueue(Q)结果:若队列为空,返回1,否则返回0。(5)读队头:GetHead(Q,x)结果:将队头元素赋给x,不删除队头。3.4.2队列的存储结构和基本运算的实现队列的类型定义:#defineMAXSIZE100//最大队列长度typedefstruct{DataTypedata[MAXSIZE];//动态分配存储空间intrear;//尾指针,若队列不空,指向队列尾元素intfront;//头指针,若队列不空,指向队列头元素//的前一个位置}SqQueue;如:SqQueuesq;sq是一个顺序队列为了有效地利用存储空间,将队列看成是一个循环队列。即sq.data[0]接在sq.data[MAXSIZE-1]之后,如果sq.rear+1=MAXSIZE,则令sq.rear=0。入队列:sq.rear=(sq.rear+1)%MAXSIZE;sq.data[sq.rear]=x;出队列:sq.front=(sq.front+1)%MAXSIZE;队空的条件:sq.rear==sq.front;队满的条件:(sq.rear+1)%MAXSIZE==sq.front;队列中的元素个数为:(sq.rear-sq.front+MAXSIZE)%MAXSIZE1.循环队列的初始化(1)主要步骤:将头指针和尾指针设为0(2)算法描述:voidInitCyQueue(SqQueue*sq){sq->front=sq->rear=0;}2.循环队列的入队(1)主要步骤:①判断队满②计算队尾指针rear的值,并放入入队的数据元素(2)算法描述:intEnCyQueue(SqQueue*sq,DataTypex){if((sq.rear+1)%MAXSIZE==sq.front){error(“队满”);return0;}else{sq.rear=(sq.rear+1)%MAXSIZE;sq.data[sq.rear]=x;return1;}}3.循环队列的出队(1)主要步骤:①判断队空②计算队头指针front的值,并将队头的数据元素出队(2)算法描述:intDeCyQueue(SqQueue*sq,DataType*x){if(sq.rear==sq.front){error(“队空”);return0;}else{sq.front=(sq.front+1)%MAXSIZE;*x=sq.data[sq.front];return1;}}4.判循环队列的队空(1)主要步骤:判断队头指针与队尾指针是否相等(2)算法描述:intEmptyCyQueue(SqQueuesq){if(sq.rear==sq.front)return1;elsereturn0;}5.读循环队列的队头(1)主要步骤:①判断队空②计算队头指针front的值,读队头的数据元素。(2)算法描述:intGetCyHead(SqQueuesq,DataType*x){if(sq.rear==sq.front){error(“队空”);return0;}else{i=(sq.front+1)%MAXSIZE;*x=sq.data[i];return1;}}二、队列的链式存储结构:链队列typedefstruct{QueuePtrfront;//队头指针QueuePtrrear;//队尾指针}LinkQueue;如:LinkQueueQ;Q是一个链队列3.5队列的应用该问题具有典型的先进先出特性,可用队列完成本题采用循环队列typedefstruct{charname[20];charsex;}Person;voidDancePartners(Persondancer[],intnum){//结构体数组dancer中存放跳舞的男女,num是//跳舞的人数。inti;Personp;SqQueueMdancers,Fdancers;InitCyQueue(&Mdancers);//男士队列初始化InitCyQueue(&Fdancers);//女士队列初始化for(i=0;i<num;i++){p=dancer[i];if(p.sex==‘F’)EnCyQueue(&Fdancers,p.name);