一、循环队列的实现

由于顺序队列的实现可能会造成假溢出,这里引入一个循环队列,当然,这里你要知道数据在队列中的最大规模,否则循环队列慢之后想拓展就会变得非常麻烦!

要求:

实验七、实现循环队列各种基本运算的算法

1 实验目的

本实验是要实现循环队列的各种基本运算,通过该实验更深刻地理解线性结构的队列的特点。

 

实验内容

实现循环队列的各种基本运算,在此基础上设计一个主程序完成以下功能:

(1) 初始化队列

(2) 判断队列是否非空

(3) 依次进队元素为学号分解后的数字,学号为20161100进队元素为数字:20161100

(4) 出队一个元素,输出该元素

(5) 依次进队元素9, 8, 7

(6) 全部元素出队,输出出队序列

(7) 释放队列

 具体代码实现如下:

#include<stdio.h>
#include<stdlib.h>

//******宏定义参数******
#define OK 1
#define NO 0
#define QUEUE_MAX_SIZE 20

//******定义数据类型别名******
typedef int Status;
typedef char ElemType;

//******声明数据结构******
typedef struct node
{
	ElemType *book;
	int front;
	int rear;
	int QueSize;
}SqQueue,*QueuePoint;

QueuePoint InitQueue()
{
	QueuePoint p=(QueuePoint)malloc(sizeof(SqQueue));
	if(p==NULL)
	{
		printf("系统无足够内存申请循环队列头结点!\n");
		return p;
	}
	p->book=(ElemType *)malloc(QUEUE_MAX_SIZE*sizeof(ElemType));
	p->front=p->rear=0;
	p->QueSize=QUEUE_MAX_SIZE;
	if(p->book == NULL)
		printf("循环队列内存分配失败!\n");
	return p;
}

Status QueueEmpty(QueuePoint Head)
{
	if(Head->front == Head->rear)
		return OK;
	return NO;
}

Status QueuePush(QueuePoint Head,ElemType ch)
{
	if((Head->rear+1)%Head->QueSize == Head->front)
	{
	//	printf("\n对不起,该队列已满,无法再插入数据!\n");
		return NO;
	}
	Head->book[Head->rear]=ch;
	Head->rear=(Head->rear+1)%Head->QueSize;
	return OK;
}

Status QueuePop(QueuePoint Head,ElemType *ch)
{
	if(Head->front == Head->rear)
	{
	//	printf("\n对不起,队列已空!\n");
		return NO;
	}
	*ch=Head->book[Head->front];
	Head->front=(Head->front+1)%Head->QueSize;
	return OK;
}

int main()
{
	QueuePoint Head;
	ElemType ch;
	Head=InitQueue();
	printf("%s\n",QueueEmpty(Head)?"该栈为空!":"该栈非空!");
	while((ch=getchar())!='\n')
		QueuePush(Head,ch);
	QueuePop(Head,&ch);
	printf("%c\n",ch);
	while((ch=getchar())!='\n')
		QueuePush(Head,ch);
	while(QueuePop(Head,&ch))
		printf("%c",ch);
	free(Head->book);
	free(Head);
	printf("\n循环队列操作结束!\n");
	return 0;
}

总结:

循环队列要掌握对队列长度的计算和公式推理 Length=(Q.rear-Q.front+Q.MaxSize)%Q.MaxSize。