顺序循环队列基于数组实现时,值得注意的就是一下几点:
1.在头尾指针移动是不是简单的++front/++rear;而是front=(front+1)%Qsize;
2.队空:rear==front.
3.队满:front==(rear+1)%Qsize
//顺序循环队 # include<stdio.h> # include<malloc.h> # include<math.h> # define QueueSize 11 //建立一个队列结构体 typedef struct { int front; int rear; int size; int data[QueueSize]; }Queue, *qQueue; //创建一个队列 qQueue Create() { qQueue Q = (Queue *)malloc(QueueSize * sizeof(Queue)); Q->front = 0; Q->rear = 0; Q->size = 0; printf("成功建立了一个长度为%d的队列\n", QueueSize-1); return Q; } //判断队空队满并返回队的长度 int IsFull(qQueue Q) { //判断是否队空 if (Q->rear == Q->front) { printf("队为空\n"); Q->size = 0; return true; } else { //判断是否队满 if ((Q->rear + 1) % QueueSize == 0) { printf("队为满"); Q->size = QueueSize; return false; } else { //返回队中的元素个数 //注释内容为另一种求队列长度的方法 /*if (Q->rear - Q->front < 0) { Q->size = Q->rear - Q->front + QueueSize; } else { Q->size = Q->rear - Q->front; }*/ printf("队列中有%d个元素\n", Q->size); } } } //入队 qQueue InQueue(qQueue Q, int P) { //判断满,若满返回错误 if ((Q->rear + 1) % QueueSize == 0) printf("队已满,请执行出队后再进行该操作!"); else { //队不满,rear=(rear+1)%n printf("请输入入队的元素:"); scanf_s("%d", &P); Q->data[Q->rear] = P; printf("入队成功!入队元素为:%d\n", Q->data[Q->rear]); Q->rear = (Q->rear+1)%QueueSize; Q->size = Q->size + 1; return Q; } } //出队 int outQueue(qQueue Q) { //判断队是否为空 if (Q->front == Q->rear) { printf("队已空,请执行入队操作后再进行该操作"); } else { //队不空front+1 int n = Q->data[Q->front]; printf("出队成功,出队元素为:%d\n", n); Q->size = Q->size - 1; Q->front = (Q->front + 1) % QueueSize; return n; } } //查看队头元素 int frontQueue(qQueue Q) { printf("队头元素为%d", Q->data[Q->front]); return Q->data[Q->front]; } //查看队尾元素 int rearQueue(qQueue Q) { printf("队尾元素为%d", Q->data[Q->rear-1]); return Q->data[Q->rear]; } //打印队列 void printQueue(qQueue Q) { printf("队头<-:"); int i; int j = Q->front; for (i = 0; i <= Q->size - 1; i++) { printf(" %d ", Q->data[j%QueueSize]); j++; } printf(":<-队尾"); } //主函数 void main() { Queue q; qQueue Q; Q = &q;//Q的初始化 int i; do { printf("\n------------****------------\n"); printf("请输入要执行的操作序号\n"); printf("1.建立空队\n"); printf("2.入队\n"); printf("3.出队\n"); printf("4.查看队头元素\n"); printf("5.查看队尾元素\n"); printf("6.打印队\n"); printf("7.判断队空/满,不满返回队的长度\n"); printf("0.退出"); printf("\n------------****------------\n"); printf("请输入序号:"); scanf_s("%d", &i); printf("\n"); switch (i) { case 1:Q=Create(); break; case 2:InQueue(Q ,i); break;//i为任意的整数,为了节省空间故用i代替 case 3:outQueue(Q); break; case 4:frontQueue(Q); break; case 5:rearQueue(Q); break; case 6:printQueue(Q); break; case 7:IsFull(Q); break; case 0:printf("结束"); break; default:printf("输入错误!请输入0---6的整数"); } } while (i != 0); }
.