/********************************知识点:************************************
队列是只允许在一端(队头)进行插入操作,在另一端(队尾)进行删除操作的线性表(FIFO结构)
循环队列:首尾相连的队列就是循环队列。
循环队列满的条件:(rear + 1) % QueueSize = front (强调是循环队列,队列满时,保留一个元素,以区别为空的时候)
循环队列为空的条件:rear = front
循环队列队长公式: (rear - front + QueueSize) % QueueSize
***************************************************************************/
#include "declear.h"
#include <stdio.h>
#define MAXSIZE 10
typedef struct
{
QElemType data[MAXSIZE];
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
return OK;
}
int QueueLength(SqQueue Q)
{
return ((Q.rear - Q.front + MAXSIZE) % MAXSIZE);
}
Status isFullQueue(SqQueue Q)
{
if ((Q.rear + 1) % MAXSIZE == Q.front)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status InQueue(SqQueue *Q, QElemType elem)
{
if (isFullQueue(*Q) == TRUE)
{
return ERROR;
}
Q->data[Q->rear] = elem;
Q->rear = (++Q->rear) % MAXSIZE; //循环队列,rear后移一个位置
return OK;
}
Status DeQueue(SqQueue *Q, QElemType *elem)
{
if ((*Q).front == (*Q).rear) //队列为空
{
return ERROR;
}
*elem = Q->data[Q->front];
Q->front = (++Q->front) % MAXSIZE; //循环队列,front后移一个位置
return OK;
}
Status visit(QElemType elem)
{
printf("%d\n", elem);
return OK;
}
int main ()
{
SqQueue queue;
int len;
// printf("length = %d\n", QueueLength(queue));
InitQueue (&queue);
InQueue (&queue, 4);
len = QueueLength(queue);
for (int index = 0; index < len; index++)
{
visit(queue.data[(queue.front + index) % MAXSIZE]);
}
printf("length = %d\n", QueueLength(queue));
return 0;
}
《大话数据结构》学习笔记之顺序队列及其源码
最新推荐文章于 2024-04-21 00:03:52 发布