一、循环队列与普通队列
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 --------------------------*/
2. 测试循环队列的操作
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;
}