一、循环队列的实现
由于顺序队列的实现可能会造成假溢出,这里引入一个循环队列,当然,这里你要知道数据在队列中的最大规模,否则循环队列慢之后想拓展就会变得非常麻烦!
要求:
实验七、实现循环队列各种基本运算的算法
1 实验目的
本实验是要实现循环队列的各种基本运算,通过该实验更深刻地理解线性结构的队列的特点。
2 实验内容
实现循环队列的各种基本运算,并在此基础上设计一个主程序完成以下功能:
(1) 初始化队列
(2) 判断队列是否非空
(3) 依次进队元素为学号分解后的数字,如学号为20161100,则进队元素为数字:2、0、1、6、1、1、0、0
(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。