队列是一种特殊的线性表,它的特殊性体现在,它只能够从一段进,从另一端出,遵循先入先出的原则。这种独特的规则,可以运用在程序设计中的很多地方,非常的巧妙。
下面,我用C语言来实现了循环队列。
/*******************************************************************/
//描述:队列的顺序存储结构,该队列为循环队列,队列的创建,插入,删除等基本操作的函数,以及对这些操作进行验证
//时间:2018.1.3 10:00
//作者:Liu ZhenHua
//*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 5
typedef int Status;
typedef char QElement;
typedef struct{
QElement data[MAXSIZE];
int front; //头指针
int rear; //尾指针
}SqQueue;
Status InitQueue(SqQueue *Q); //初始化队列,头指针和尾指针都指向零
int QueueLength(SqQueue *Q); //获取队列长度
Status ENQueue(SqQueue *Q,QElement e); //在队列末尾插入新元素
void PrintSQ(SqQueue *Q); //顺序打印队列中的元素
Status DEQueue(SqQueue *Q,QElement *e); //出队列操作
void printSL(void); //打印一行分割线
int main()
{
SqQueue *SQ;QElement val,*pval=&val;
SQ = (SqQueue*)malloc(sizeof(SqQueue));
if(InitQueue(SQ))printf("队列初始化成功!\n"); //初始化队列
printf("队列中有%d个元素\n",QueueLength(SQ)); //获取元素长度
printSL();
if(ENQueue(SQ,'a'))printf("插入元素%c成功!\n",'a'); //入队列
if(ENQueue(SQ,'b'))printf("插入元素%c成功!\n",'b');
if(ENQueue(SQ,'c'))printf("插入元素%c成功!\n",'c');
if(ENQueue(SQ,'d'))printf("插入元素%c成功!\n",'d');
printf("队列中有%d个元素\n",QueueLength(SQ));
PrintSQ(SQ);
printSL();
if(DEQueue(SQ,pval))printf("出队列操作成功!\n"); //出队列
if(DEQueue(SQ,pval))printf("出队列操作成功!\n"); //出队列
PrintSQ(SQ);
if(ENQueue(SQ,'x'))printf("插入元素%c成功!\n",'x'); //循环式入队列
if(ENQueue(SQ,'x'))printf("插入元素%c成功!\n",'x'); //循环式入队列
PrintSQ(SQ);
printf("结束!\n");
return 0;
}
/**********************************************/
//函数名: InitQueue
//描述 : 初始化队列指针
//参数 :队列指针
//返回值:状态值
//作者 :LiuZhenHua
/**********************************************/
Status InitQueue(SqQueue *Q){
Q->front = 0;
Q->rear = 0;
return OK;
}
/**********************************************/
//函数名: QueueLength
//描述 : 获取队列长度
//参数 :队列指针
//返回值:长度值
//作者 :LiuZhenHua
/**********************************************/
int QueueLength(SqQueue *Q){
int f,r;
f = Q->front;
r = Q->rear;
if(r >= f){
return r-f;
}else{
return (r + MAXSIZE - f);
}
}
/**********************************************/
//函数名: printSL
//描述 : 打印一行分割线Print Split Line
//参数 :结无
//返回值:无
//作者 :LiuZhenHua
/**********************************************/
void printSL(void){
int i;
for(i = 0; i < 20; i++){
printf("-");
}
printf("\n");
}
/**********************************************/
//函数名: ENQueue
//描述 : 若队列未满,则插入元素e到队尾
//参数 :结构体指针,插入元素
//返回值:状态值
//作者 :LiuZhenHua
/**********************************************/
Status ENQueue(SqQueue *Q,QElement e){
int f,r;
f = Q->front;
r = Q->rear;
if((r+1)%MAXSIZE == f){
return ERROR; //队列已满
}
Q->data[r] = e;
Q->rear = (r+1)%MAXSIZE;
return OK;
}
/**********************************************/
//函数名: PrintSQ
//描述 : 打印队列中的元素
//参数 :结构体指针
//返回值:状态值
//作者 :LiuZhenHua
/**********************************************/
void PrintSQ(SqQueue *Q){
int f,i,length;
f = Q->front;
length = QueueLength(Q);
if(QueueLength(Q)==0){
printf("队列为空!\n");
}else{
printf("队列中有%d个元素。分别是:\n",QueueLength(Q));
for(i = 0; i < length; i++){
printf("data[%d] = %c\n",f,Q->data[f]);
f = (f+1)%MAXSIZE;
}
}
}
/**********************************************/
//函数名: DEQueue
//描述 : 循环队列的出队列操作
//参数 :结构体指针,数据指针
//返回值:状态值
//作者 :LiuZhenHua
/**********************************************/
Status DEQueue(SqQueue *Q,QElement *e){
int length,f;
f = Q->front;
length = QueueLength(Q);
if(length == 0){
return ERROR;
}
*e = Q->data[f];
Q->front=(f+1)%6; //头指针后移
return OK;
}