队列之顺序存储实现
2017-10-15 10:01
211 查看
队列
特点:FIFO,先入先出,插入删除在两段进行(入队出队)操作:
生成。
判断未满
判断非空
入队
出队
数组实现
一个一维数组记录头元素位置变量front
记录尾元素位置变量rear
开始时front和rear都是-1。
循环队列
使用求余实现循环线性数组的问题:
在一个固定长度的数组内,先不断入队直到填满数组,再几次出队。此时rear指向最大位置,数组中仍然有空间,但是却无法再插入元素。
出现一个问题:
若用front=rear表示队列为空,队列满时也会出现front=rear的问题。出现原因:我们用front和rear的距离来表示情况,距离一共有n种情况,而队列一共有n+1中情况(包括队列为空)。我们无法用n种表示方法来表示n+1种情况。
解决方法:
使用额外标记:Size或者tag域,size记录元素个数,tag记录最后一次操作。
仅使用n-1个数组空间
实现代码
此处采用front==rear表示非空此处采用(rear+1)%maxsize==front表示已满,即队列只存储n-1个元素,rear+1对maxsize取余等于front时一个位置时队列已满。
初始化
建立队列结构体,包括一个头指针,尾指针,最大容量和一个指向数组首地址的指针。typedef int Position; struct QNode { ElementType *Data; /* 存储元素的数组 */ Position Front, Rear; /* 队列的头、尾指针 */ int MaxSize; /* 队列最大容量 */ }; typedef struct QNode *Queue;
创建队列
创建指向队列指针创建数组
初始化front和rear的值
初始化最大容量的值
Queue CreateQueue( int MaxSize ) { Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType)); Q->Front = Q->Rear = 0; Q->MaxSize = MaxSize; return Q; }
判断已满
rear+1对maxsize取余等于front时一个位置时队列已满bool IsFull( Queue Q ) { return ((Q->Rear+1)%Q->MaxSize == Q->Front); }
入队
判断队列未满rear位置后移,rear得到值。
bool AddQ( Queue Q, ElementType X ) { if ( IsFull(Q) ) { printf("队列满"); return false; } else { Q->Rear = (Q->Rear+1)%Q->MaxSize; Q->Data[Q->Rear] = X; return true; } }
判断非空
利用front==rear判断```
bool IsEmpty( Queue Q )
{
return (Q->Front == Q->Rear);
}
### 出队 - 判断非空 - front后移,元素出队。
ElementType DeleteQ( Queue Q ) { if ( IsEmpty(Q) ) { printf("队列空"); return ERROR; } else { Q->Front =(Q->Front+1)%Q->MaxSize; return Q->Data[Q->Front]; } }
```
相关文章推荐
- 队列顺序存储 - 设计与实现 - API函数
- 循环队列-顺序存储-c语言实现
- 队列-顺序存储-简单实现
- 队列顺序存储 - 设计与实现 - API函数
- 队列顺序存储 - 设计与实现 - API函数
- 队列的顺序存储表示---数组实现
- Java使用顺序存储实现队列
- 队列顺序循环存储实现
- 队列(顺序存储)C++模板实现
- 顺序存储队列实现
- 数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .
- 队列的顺序存储C实现
- 数据结构之循环队列(顺序表存储)——C++模板类实现
- 循环队列-顺序存储-Java实现
- 循环队列 顺序存储 C实现
- 队列的顺序存储实现
- 队列的顺序存储和链式存储实现
- 队列(顺序存储) java实现
- (C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作
- 队列的顺序存储实现—循环队列