2023年6.队列的顺序存储结构循环队列.pdf
队列的顺序存储结构-循环队列(一)#include#include#define OK 1#define ERROR 0 typedef int Status;/Status 是函数的类型,其值是函数结果状态代码,如 OK等 typedef int QElemType;#define MAXQSIZE 100/最大队列长度(对于循环队列,最大队列长度要减 1)typedef struct QElemType*base;/初始化的动态分配存储 空间 int front;/头指针,若队列不空,指向队列头元素 int rear;/尾指针,若队列不空,指向队列尾元素的下一个位置 SqQueue;Status InitQueue(SqQueue&Q)/构造一个空队列 Q,该队列预定义大小为 MAXQSIZE/请补全代码 Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType);if(!Q.base)return ERROR;Q.front=Q.rear=0;return OK;Status EnQueue(SqQueue&Q,QElemType e)/插入元素 e 为 Q的新的队尾元素/请补全代码 if(Q.rear+1)%MAXQSIZE=Q.front)return ERROR;Q.baseQ.rear=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;Status DeQueue(SqQueue&Q,QElemType&e)/若队列不空,则删除 Q的队头元素,用 e 返回其值,并返回 OK;否则返回 ERROR/请补全代码 if(Q.front=Q.rear)return ERROR;e=Q.baseQ.front;Q.front=(Q.front+1)%MAXQSIZE;return OK;Status GetHead(SqQueue Q,QElemType&e)/若队列不空,则用 e 返回队头元素,并返回 OK,否则返回 ERROR/请补全代码 if(Q.front=Q.rear)return ERROR;e=Q.baseQ.front;return OK;int QueueLength(SqQueue Q)/返回 Q的元素个数/请补全代码 return(Q.rear+MAXQSIZE-Q.front)%MAXQSIZE;Status QueueTraverse(SqQueue Q)/若队列不空,则从队头到队尾依次输出各个队列元素,并返回 OK;否则返回 ERROR.int i;i=Q.front;if(Q.front=Q.rear)printf(The Queue is Empty!);/请填空 else printf(The Queue is:);while(i Q.rear)/请填空 printf(%d,Q.basei);/请填空 i=i+1;/请填空 printf(n);return OK;int main()int a;SqQueue S;QElemType x,e;if(InitQueue(S)/判断顺序表是否创建成功,请填空 printf(A Queue Has Created.n);while(1)printf(1:Enter n2:Delete n3:Get the Front n4:Return the Length of the Queuen5:Load the Queuen0:ExitnPlease choose:n);scanf(%d,&a);switch(a)case 1:scanf(%d,&x);if(!EnQueue(S,x)printf(Enter Error!n);/判断入队是否合法,请填空 else printf(The Element%d is Successfully Entered!n,x);break;case 2:if(!DeQueue(S,e)printf(Delete Error!n);/判断出队是否合法,请填空 else printf(The Element%d is Successfully Deleted!n,e);break;case 3:if(!GetHead(S,e)printf(Get Head Error!n);/判断 Get Head是否合法,请填空 else printf(The Head of the Queue is%d!n,e);break;case 4:printf(The Length of the Queue is%d!n,QueueLength(S);/请填空 break;case 5:QueueTraverse(S);/请填空 break;case 0:return 1;队列的顺序存储结构-循环队列(二)#include#include#include#define MAXSIZE 100#define TRUE 1#define FALSE 0 typedef int DataType;typedef struct DataType dataMAXSIZE;int front;/头指针指示器 int rear;/为指针指示器 SeqQueue;/初始化操作 void InitQueue(SeqQueue*Q)/将*Q初始化为一个空的循环队列 Q-front=Q-rear=0;/判断队列是否为空或满 void IsEmpty_full(SeqQueue*Q)if(Q-front=Q-rear)cout 该队列为空 rear+1)%MAXSIZE=Q-front)cout 该队列为满 endl;else cout 该队列既不为空也不为满 rear+1)%MAXSIZE=Q-front)/队列已经满了 return(FALSE);Q-dataQ-rear=x;Q-rear=(Q-rear+1)%MAXSIZE;/重新设置队尾指针 return(TRUE);/操作成功/出队操作 int DeleteQueue(SeqQueue*Q,DataType*x)/删除队列的队头元素,用 x 返回其值 if(Q-front=Q-rear)/队列为空 return(FALSE);*x=Q-dataQ-front;Q-front=(Q-front+1)%MAXSIZE;/重新设置队头指针 return(TRUE);/操作成功/清空元素 void ClearQueue_Sq(SeqQueue&Q)Q.front=Q.rear=0;/构造队列,数据元素由键盘输入 void CreateQueue_Sq(SeqQueue&Q)DataType temp;cout 输入数据元素(按-1 结束)temp;while(temp!=-1)if(Q.rear+1)%MAXSIZE=Q.front)couttemp;/队列的长度 int QueueLength_Sq(SeqQueue Q)return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;/由头到尾依次输出队列的数据元素 void OutputQueue_Sq(SeqQueue Q)if(Q.front=Q.rear)cout 空队列,没有元素 endl;else cout 该循环队列各元素依次为:;for(int k=0;k=QueueLength_Sq(Q)-1;k+)coutQ.data(Q.front+k)%MAXSIZE;coutendl;void main()int flag=1,select;cout 循环队列的基本操作 endl;cout 1.请输入循环队列元素:endl;cout 2.判断队列是否为空或是否为满 endl;cout 3.当前队头元素出队并将其输出循环队列的各元素 endl;cout 4.将 x 入队并输出循环队列的各元素 endl;cout 5.当前循环队列的长度 endl;cout 6.清空队列 endl;cout 7.退出 endl;while(flag)coutselect;SeqQueue Q;int x,a,e;switch(select)case 1:InitQueue(&Q);CreateQueue_Sq(Q);OutputQueue_Sq(Q);break;cout 请选择:;case 2:IsEmpty_full(&Q);break;cout 请选择:;case 3:DeleteQueue(&Q,&a);OutputQueue_Sq(Q);break;cout 请选择:;case 4:coutx;EnterQueue(&Q,x);OutputQueue_Sq(Q);break;cout 请选择:;case 5:cout 当前循环队列的长度是:(Q.rear-Q.front+MAXSIZE)%MAXSIZEendl;break;cout 请选择:;case 6:ClearQueue_Sq(Q);cout 该循环队列已清空,;break;case 7:flag=0;break;