一、循环队列与普通队列
1. 空判断条件相同:q->head == q->tail;
2. 满判断条件不同
1)循环队列:q->head == (q->tail + 1)%MAXSIZE;
2)普通队列:q->tail == MAXSIZE;
3. head与tail取值方式不同
1)循环队列:q->head = (q->head + 1)%MAXSIZE; q->tail = (q->tail + 1)%MAXSIZE;
2)普通队列:q->head += 1; q->tail += 1;
4. 队列长度都用len = q->tail - q->head,但是循环队列计算的len有可能小于0,需要判断,如果小于0,需加上MAXSIZE。
1.循环队列结构和操作定义
CycQueue.h
#define QUEUEMAX 15 //功能:循环队列结构体(解决顺序队列假溢出问题) typedef struct{ DATA data[QUEUEMAX]; int head; int tail; }CycQueue; /*---------------------循环队列所有操作原型声明 start ------------------------*/ //功能:初始化循环队列 CycQueue *CycQueueInit(); //功能:释放循环队列 void CycQueueFree(CycQueue *q); //功能:获取循环队列状态 int CycQueueIsEmpty(CycQueue *q); int CycQueueIsFull(CycQueue *q); int CycQueueLen(CycQueue *q); //功能:入队操作 int CycQueueIn(CycQueue *q, DATA data); //功能:出队操作 DATA *CycQueueOut(CycQueue *q); //功能:获取队头元素 DATA *CycQueuePeek(CycQueue *q); /*---------------------循环队列所有操作原型声明 end --------------------------*/ /*---------------------循环队列所有操作具体实现 start ------------------------*/ //功能:初始化循环队列 CycQueue *CycQueueInit(){ CycQueue *q; if(q=(CycQueue *)malloc(sizeof(CycQueue))){ q->head = 0; q->tail = 0; return q; } else return NULL; } //功能:释放循环队列 void CycQueueFree(CycQueue *q){ if(q!=NULL) free(q); } //功能:获取循环队列状态 int CycQueueIsEmpty(CycQueue *q){ return (q->head == q->tail); } int CycQueueIsFull(CycQueue *q){ return (q->head == (q->tail + 1)%QUEUEMAX); } int CycQueueLen(CycQueue *q){ int len; len = q->tail - q->head; if(len < 0) len = len + QUEUEMAX; return len; } //功能:入队操作 int CycQueueIn(CycQueue *q, DATA data){ if(CycQueueIsFull(q)){ printf("对列已满!"); return 0; } else{ q->tail = (q->tail + 1)%QUEUEMAX; q->data[q->tail] = data; return 1; } } //功能:出队操作 DATA *CycQueueOut(CycQueue *q){ if(CycQueueIsEmpty(q)){ printf("对列为空!"); return NULL; } else{ q->head = (q->head + 1)%QUEUEMAX; return &q->data[q->head]; } } //功能:获取队头元素 DATA *CycQueuePeek(CycQueue *q){ if(CycQueueIsEmpty(q)){ printf("对列为空!"); return NULL; } else return &q->data[(q->head + 1)%QUEUEMAX]; } /*---------------------循环队列所有操作具体实现 end --------------------------*/
CycQueueTest.cpp
#include<stdio.h> #include<stdlib.h> #include<time.h> typedef struct{ int num; int date; }DATA; #include "SeqQueue.h" #include"CycQueue.h" int main(){ int select; int isTrue; int num = 0; DATA data; DATA *data1; CycQueue *cq; do{ printf("---------------------------\n"); printf("1.初始化循环对列 2.释放循环队列\n"); printf("3.判断循环队列是否为空 4.判断循环队列是否为满\n"); printf("5.求循环队列的长度 6.入队操作\n"); printf("7.出队操作 8.获取队头元素\n"); printf("0.退出\n"); printf("请选择执行的操作序号:"); //select = getch(); fflush(stdin); scanf("%d", &select); switch(select){ case 1: cq = CycQueueInit(); if(cq==NULL) printf("初始化队列结束\n"); break; case 2: CycQueueFree(cq); break; case 3: isTrue = CycQueueIsEmpty(cq); if(isTrue) printf("循环队列为空\n"); else printf("循环队列不为空\n"); break; case 4: isTrue = CycQueueIsFull(cq); if(isTrue) printf("循环队列已满\n"); else printf("循环队列未满\n"); break; case 5: isTrue = CycQueueLen(cq); printf("队列的长度为:%d", isTrue); break; case 6: data.num = ++num; data.date = time(NULL); CycQueueIn(cq, data); break; case 7: data1 = CycQueueOut(cq); printf("出队元素为:%d,%d\n", data1->num, data1->date); break; case 8: data1 = CycQueuePeek(cq); printf("队头元素为:%d,%d\n", data1->num, data1->date); break; } }while(select != 0); system("pause"); return 1; }