队列的顺序存储结构
一 顺序队列的描述
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;
}
浙公网安备 33010602011771号