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

队列的顺序表示和实现

2015-10-22 18:45 435 查看
和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。为了在C语言中描述方便起见,在此我们约定:初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“头指针增1”。因此,在非空队列中,头指针始终指向队列尾元素,而尾指针始终指向队列尾元素的下一个位置。如图所示



假设当前为队列分配的最大空间为6,则当队列不可再插入新的队尾元素否则会因数组越界遭致程序代码被破坏,然而此时又不宜如顺序栈那样,进行存储再分配扩大存储空间,因为队列的实际可用空间并未占满,一个较巧妙的办法是将顺序队列臆造为一个环状的空间,称之为循环队列。如图所示



// - - - - -循环队列——队列的顺序存储结构 - - - - -

typedef struct{
int *base; //初始化的动态分配存储空间
int Front; //头指针,若队列不空,指向队列头元素
int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;


//InitQueue
//构造一个空队列Q
int InitQueue(SqQueue &Q){
Q.base=(int *)malloc(MAXQSIZE*sizeof(int));
if(!Q.base){ //存储分配失败
exit(OVERFLOW);
}
Q.Front=Q.rear=0;
return OK;
}//Enqueue
//插入元素e为Q的新的队尾元素
int EnQueue(SqQueue &Q,int e){
if((Q.rear+1)%MAXQSIZE==Q.Front){ //队列满
return ERROR;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}//DeQueue
//删除Q的队头元素,并用e返回其值
int DeQueue(SqQueue &Q,int &e){
if(Q.Front==Q.rear){
return ERROR;
}
e=Q.base[Q.Front];
Q.Front=(Q.Front+1)%MAXQSIZE;
return OK;
}//QueueLength
//返回队列的长度
int QueueLength(SqQueue Q){
return(Q.rear-Q.Front+MAXQSIZE)%MAXQSIZE;
}//QueueTraverse
//遍历Q
int QueueTraverse(SqQueue Q){
int l=QueueLength(Q);
for(int i=0;i<l;i++){
printf("%d ",Q.base[i]);
}
printf("\n");
}//main
int main(){
SqQueue Q;
InitQueue(Q);
int e;
printf("Please input elem:\n");
while(~scanf("%d",&e)){
EnQueue(Q,e);
}
printf("Output elem:\n");
QueueTraverse(Q);
}
//结果预览

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息