双端队列的实现

来源:互联网 发布:js实现中英文切换代码 编辑:程序博客网 时间:2024/04/30 02:47

原题:试采用一维数组实现循环的双端队列,即可以在任意一端入队列与出队列,并实现以下公操作:初始化、判空、求元素个数、入队列与出队列。分析:用tag(=1、2)来标识对哪一端操作,tag==1时对front端操作,tag==2时对rear端操作。

#include<iostream.h>#include<stdlib.h>typedef enum{FALSE,TRUE,OK,ERROR,OVER_FLOW}Status;#define MAXSIZE 100//存储空间最大容量#define ElemType chartypedef struct{ElemType elem[MAXSIZE];//队列空间int front;//队头int rear;//队尾}DuQueue;void InitQueue(DuQueue &Q){//构造一个空的双端队列Q.front=Q.rear=0;}Status QueueEmpty(DuQueue Q){//判空函数,为空返回TRUE,否则返回FALSEif(Q.front == Q.rear){cout<<"当前队列为空!"<<endl;return TRUE;//Q.front==Q.rear时表示队列为空,返回true}else{cout<<"当前队列非空!"<<endl;return FALSE;//否则返回false}}int QueueLength(DuQueue Q,int &length){//返回队列Q的元素个数length=(Q.rear-Q.front+MAXSIZE)%MAXSIZE;cout<<"当前队列长度为:"<<length<<endl;return length;}Status EnQueue(DuQueue &Q,ElemType e,int tag){//插入元素e到队列中,tag==1时插入到front端,否则插入到rear端if((Q.rear+1)%MAXSIZE == Q.front)return OVER_FLOW;//队列已满,返回OVER_FLOWelse if(tag == 1){//在front端插入Q.front=(Q.front-1+MAXSIZE)%MAXSIZE;Q.elem[Q.front]=e;//Q.front指向队头元素return OK;//插入成功}else if(tag == 2){//在rear端插入Q.elem[Q.rear]=e;//Q.rear指向虚单元Q.rear=(Q.rear+1)%MAXSIZE;return OK;//插入成功}elsereturn ERROR;//tag非法,返回ERROR}Status DeQueue(DuQueue &Q,ElemType &e,int tag){//队列非空时出队列,tag==1时删除front端元素,tag==2时删除rear端元素,并用e返回其值if(QueueEmpty(Q)==TRUE)return ERROR;//队列为空,返回ERRORelse if(tag == 1){//在front端出队e=Q.elem[Q.front];Q.front=(Q.front+1)%MAXSIZE;return OK;//出队成功}else if(tag == 2){//在rear端出队Q.rear=(Q.rear-1+MAXSIZE)%MAXSIZE;e=Q.elem[Q.rear];return OK;//出队成功}elsereturn ERROR;//tag值非法,返回ERROR}Status DisplayDeQueue(DuQueue Q){//从队头到队尾逐个输出队列中的元素if(QueueEmpty(Q)==TRUE){cout<<"当前队列为空!"<<endl;return ERROR;}while(Q.front!=Q.rear){cout<<Q.elem[Q.front]<<" ";Q.front=(Q.front+1)%MAXSIZE;}cout<<endl;return OK;}void main(){DuQueue Q;InitQueue(Q);int length;for(int i=0;i<10;i++){//生成随机字母并将其入队列int flag=1;char e=rand()%26+'a';if(flag==rand()%2)EnQueue(Q,e,1);elseEnQueue(Q,e,2);}DisplayDeQueue(Q);QueueLength(Q,length);}


 

原创粉丝点击