线性结构 循环队列

一、循环队列与普通队列

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值