您的位置:首页 > 其它

队列之顺序存储实现

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];
}
}

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