队列的顺序表示和实现
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
假设当前为队列分配的最大空间为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); }//结果预览
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- 使用C语言来解决循环队列问题的方法
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- javascript中利用数组实现的循环队列代码
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解