循环队列--顺序存储
#include<stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 //最多容纳19个元素,front之前的一个空间空出来 typedef int Status; typedef int QElemType; typedef struct { QElemType data[MAXSIZE]; int front;//指向下一次要出队的元素 int rear;//指向的位置是下一个入队元素的位置 }SqQueue; Status visit(QElemType c){ printf("%d ",c); return OK; } Status InitQueue(SqQueue *Q){ Q->front = 0; Q->rear =0; return OK; } Status ClearQueue(SqQueue *Q){ Q->front = Q->rear = 0; return 0; } Status QueueEmpty(SqQueue Q){ if(Q.front == Q.rear){ return TRUE; } else { return FALSE; } } int QueueLength(SqQueue Q){ return (Q.rear - Q.front + MAXSIZE) % MAXSIZE; } Status GetHead(SqQueue Q,QElemType *e){ if(Q.front == Q.rear){ return ERROR;//空队列 } *e = Q.data[Q.front]; return OK; } Status EnQueue(SqQueue *Q,QElemType e){ if(((Q->rear + 1) % MAXSIZE) == Q->front){ return ERROR;//队列满 } Q->data[Q->rear] = e; Q->rear = (Q->rear + 1) % MAXSIZE; return OK; } Status DeQueue(SqQueue *Q,QElemType *e){ if(Q->rear == Q->front){ return ERROR; } *e = Q->data[Q->front]; Q->front = (Q->front + 1) % MAXSIZE; return OK; } Status QueueTraverse(SqQueue Q){ int i; i = Q.front; while(i != Q.rear){ visit(Q.data[i]); i = (i + 1) % MAXSIZE; } printf("\n"); return OK; } int main(){ Status j; int i = 0,l; QElemType e; SqQueue Q; InitQueue(&Q); printf("初始化队列后,队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); for( i = 1; i <= 21 ; i++){ EnQueue(&Q,i); } printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); QueueTraverse(Q); DeQueue(&Q,&e); printf("出队的元素是 %d\n",e); printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); QueueTraverse(Q); DeQueue(&Q,&e); printf("出队的元素是 %d\n",e); printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); QueueTraverse(Q); DeQueue(&Q,&e); printf("出队的元素是 %d\n",e); EnQueue(&Q,1000); printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); QueueTraverse(Q); EnQueue(&Q,2000); printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); QueueTraverse(Q); EnQueue(&Q,3000); printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); QueueTraverse(Q); EnQueue(&Q,4000); printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q)); QueueTraverse(Q); GetHead(Q,&e); printf("队首元素 %d\n",e); ClearQueue(&Q); printf("清空队列后,队列是否为空 %d\t 队列长度 %d\n",QueueEmpty(Q),QueueLength(Q)); printf("再次遍历队列"); QueueTraverse(Q); }
如需转载,请注明文章出处,谢谢!!!