leiyahui

纸上得来终觉浅,绝知此事要躬行
队列的顺序存储结构

一 顺序队列的描述

typedef struct
    {
        datatype data[maxsize];
        int front, rear;
    }squeue,*squlink;

Q=(squlink)malloc(sizeof(squeue))

当要反复进行入栈和出栈操作时,当Q->rear=maxsize-1时就插不进去元素了,但是此时队的存储结构不一定满了,这种现象被称为假溢出。为了克服假溢出,讲数组data首尾相连,构成循环队列。

为了队列的操作方便,设指针Q->front所指向的节点为引导节点,其下一位才是队首元素a0,而Q->rear仍指向队尾元素。

二 循环队列的基本操作的算法实现

循环操作的关键无非是把队头与队尾相连接,要实现的方法就是进行模运算,当Q->rear 到达maxsize-1的时候,如果队列还没有满,并且还想再插入元素则就要进行求模运算了.

基本操作如下

Q->rear=(Q->rear+1)%maxsize;

Q->data[Q->rear]=e;

同样,出队操作要返回队头元素,所以应该先将队头指针Q->front加1,然后再取队头元素

Q->front=(Q->front+1)%maxsize;

return Q->data[Q->front];

还有就是队空队满的判定

队空判定:初始队空只要置Q->front=Q->rear=0即可。随着进栈和出栈,中间过程也会出现栈空的现象,此时只要满足Q->front=Q->rear即可

队满判定:如果让整张顺序表全部充满,则Q->front=Q->rear,那样的话就无法分辨是队满还是队空,所以说为了区别队满和队空,就牺牲一个单元空间。

Q->front所指向的单元空间不存储东西。这样的话就是(Q->rear+1)%maxsize=Q->front

三 循环队列的实现

1 置队空的算法

void ClearQueue(squlink Q)

{

Q->front=Q->rear=0;

}

2 判断队空算法

int EmptyQueue(squlink Q)

{

if(Q->front!=Q->rear)

{

return 0;

}

else

{

return 1;

}

}

3 元素e进队算法

int Enqueue(squlink Q, e)
{
    if ((Q->rear + 1) % maxsize != Q->front)
    {
        Q->rear = (Q->rear + 1) % maxsize;
        Q->data[Q->rear] = e;
    }
}

4 出队算法

datatype DeQueue(sqlink Q)
{
    if (Q->rear == Q->front)
    {
        return NULL;    //队空
    }
    else
    {
        Q->front = Q->front + 1;
        return Q->data[Q->front];
    }
}

5 求队列中当前元素个数的算法

int Lenqueue(sqlink Q)
{
    int i;
    return (Q->rear - Q->front + maxsize) % maxszie;  //防止出现负值
    return i;
}

 

posted on 2015-11-17 17:47  雷大叔  阅读(319)  评论(0)    收藏  举报