您的位置:首页 > 理论基础 > 数据结构算法

数据结构之队列的顺序表示及其实现(循环队列)

2016-08-06 23:03 701 查看
记录一下自己学习过程中写的代码。以下是我看严蔚敏老师的数据结构教材后,结合教材所讲用C语言实现了关于队列的顺序表示及其实现的基本操作,供以后复习所用。和顺序栈类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元一次存放从队头到队尾的元素之外,尚需附设队头指针Front和队尾指针Rear分别指示队头元素和队尾元素的位置。初始化建立一个空队列的时候,令队头指针和队尾指针值都为0,每当插入新的队尾元素时,Rear加1;每当删除队头元素时,Front加1。因而,在非空队列中,队头指针始终指向队头元素,队尾指针始终指向队尾元素的下一个位置(非队尾元素所在位置)。在本程序中,考虑到可能因为插入元素时导致越界而使得程序代码被破坏,采用一种环状的结构,即循环队列来实现队列的顺序表示。可以看到,在输入一致的情况下,无论是用链队列还是循环队列,所得到的最终结果是一样的。

编译软件:VC++6.0 

测试用例结果截图如下:



源代码如下:
/**********************************
循环队列——队列的顺序表示和实现(完整代码,C实现)
Author:大地在我腳下
Date:2016-8-6
Email:jsrcdjcyy@163.com
**********************************/
#include<stdio.h>
#include<stdlib.h>

#define MAXQSIZE 100//最大队列长度

typedef struct LinkQueue
{
int Front;
int Rear;
int* base; //初始化的动态分配存储空间
int Queuesize;
}LinkQueue,*Queue;

bool CreateQueue(Queue);//建立循环队列
bool DeleteQueue(Queue,int*);//在队头删除元素
bool QueueEmpty(Queue); //队列是否为空
bool EnterQueue(Queue,int);//在队尾插入元素
void TraverseQueue(Queue);//遍历队列并输出元素
void DestroyQueue(Queue);//销毁已存在的队列
void ClearQueue(Queue);//清空已存在的队列
int Queuelength(Queue);//计算队列长度,即队列元素个数
int GetHead(Queue);//返回队列队头元素

void main()
{int d;LinkQueue Q;
//创建一个空的循环队列
if(CreateQueue(&Q)==1)
printf("Successfully build queue!\n");

//进行入队(插入)操作,之后遍历输出队列内数据
EnterQueue(&Q,6);
EnterQueue(&Q,25);
EnterQueue(&Q,89);
EnterQueue(&Q,127);
EnterQueue(&Q,888);
TraverseQueue(&Q);

//当前队列的长度
printf("\nNow the length of queue is:%d\n",Queuelength(&Q));

//取出队头元素
if(QueueEmpty(&Q))
printf("\nNow the queue is empty!");
else printf("Now the head of queue is:%d\n",GetHead(&Q));

//进行出队(删除)操作,之后遍历输出
if(QueueEmpty(&Q))
printf("\nNow the queue is empty!");
else
{printf("\nDeleting succeed!\n");
DeleteQueue(&Q,&d);
printf("The deleted data is:%d\n",d);
TraverseQueue(&Q);
}

//重新输出队列的长度
printf("\nNow the length of queue is:%d\n",Queuelength(&Q));

//重新取出队头元素
if(QueueEmpty(&Q))
printf("\nNow the queue is empty!");
else printf("Now the head of queue is:%d\n",GetHead(&Q));

//清空队列,并输出清空后队列中的数据
ClearQueue(&Q);
printf("\ndata cleared!\n");
TraverseQueue(&Q);
}

//建立循环队列
bool CreateQueue(Queue Q)
{Q->base=(int*)malloc(MAXQSIZE*sizeof(int));
if(!Q->base)
{printf("Malloc failed!");
exit(-1);
}
Q->Front=Q->Rear=0;
Q->Queuesize=0;
return true;
}

bool EnterQueue(Queue Q,int e)
{if((Q->Rear+1)%MAXQSIZE==Q->Front)//循环队列满
{printf("Now the queue is full!");
return false;
}
*(Q->base+Q->Rear)=e;
Q->Rear=(Q->Rear+1)%MAXQSIZE;
Q->Queuesize++;
return true;
}

bool QueueEmpty(Queue Q)
{if(Q->Rear==Q->Front) return true;
else return false;
}

bool DeleteQueue(Queue Q,int *d)
{
if(QueueEmpty(Q))
{printf("Now the queue is empty!");
return false;
}
*d=*(Q->base+Q->Front);
Q->Front=(Q->Front+1)%MAXQSIZE;
Q->Queuesize--;
return true;
}

void TraverseQueue(Queue Q)
{int p=Q->Front;
if(QueueEmpty(Q)) printf("Now the queue is empty!\n");
else
{printf("Now datas in the queue are:\n");
while(p!=Q->Rear)
{printf("%d",*(Q->base+p));
p=(p+1)%MAXQSIZE;
putchar(32);
}
printf("\n");
}
}

void DestroyQueue(Queue Q)
{free(Q->base);
Q->Rear=0;
Q->Front=0;
Q->Queuesize=0;
}

void ClearQueue(Queue Q)
{if(QueueEmpty(Q)) printf("Now the queue is empty!");
else DestroyQueue(Q);
}

int Queuelength(Queue Q)
{return Q->Queuesize;
}

int GetHead(Queue Q)
{return *(Q->base+Q->Front);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息