队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。线性表分为顺序存储和链式存储,栈是线性表,
所以也有这两种存储方式。同样,队列作为一种特殊的线性表,也同样存在这两种存储方式。我们先来看队列的顺序存储结构。
* 循环队列的顺序存储结构 */ typedef struct { ElemType data[MAXSIZE]; int front; /*头指针*/ int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */ }SqQueue;
顺序队列初始化
顺序队列初始化,就是把队头和队尾都归0,也就是 Q->front=0; Q->rear=0;
/* 初始化一个空队列Q @params Q 队列指针 */ int InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; return OK; }
顺序队列入队
顺序队列入队操作,最开始需要判断队列是否满了,未满则先给队尾元素赋值,然后再将队尾指针向后移动一位,若到最后则转到数组头部
。
/* 未满队列插入操作 @params Q 队列指针 @params e 插入元素 */ Status EnQueue(SqQueue *Q,ElemType e) { if((Q->rear+1)%MAXSIZE == Q->front) return ERROR; Q->data[Q->rear] = e; Q->rear = (Q->rear+1)%MAXSIZE; return OK; }
顺序队列出队
顺序队列出队操作,最开始需要判断队列是否为空了,不为空则先给队头元素赋值给e,然后再将队头向后移一位,若到最后则转到数组头部
。
/* 未空队列出栈操作 @params Q 队列指针 @params e 接收出队数据指针 */ Status DeQueue(SqQueue *Q,ElemType *e) { if(Q->rear == Q->front) return ERROR; *e = Q->data[Q->front]; Q->front = (Q->front+1)%MAXSIZE; return OK; }
顺序队列就讲到这里,接下来我们先来看队列的链式存储结构,队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。。
/* 结点结构 */ typedef struct Node { ElemType data; struct Node * next; }Node,*QueueNode; /* 队列的链表结构 */ typedef struct { QueueNode front; QueueNode rear; int length; }QueueList;
链式队列初始化
链式队列初始化,先产生一个头结点,然后让头结点指向NULL,再分别让队列的头尾指向头结点;
/* 初始化链式队列 @params Q 队列指针 */ Status InitQueue(QueueList *Q){ QueueNode head; head = (QueueNode)malloc(sizeof(Node)); if(!head) return ERROR; head->next = NULL; Q->front = head; Q->rear = head; return OK; }
链式队列入队操作
链式队列入队操作,先产生一个结点,让该结点指向NULL,再让队列的尾结点指向该结点,最后将该结点赋值给尾结点,队列计数加一
/* 入队操作 @params Q 队列指针 @params e 入队元素 */ Status EnQueue(QueueList *Q,ElemType e) { QueueNode n,t; n = (QueueNode)malloc(sizeof(Node)); if(!n) return ERROR; n->data = e; n->next = NULL; Q->rear->next = n; Q->rear = n; Q->length ++; return OK; }
链式队列出队操作
链式队列出队操作,先判断是否为空队列,不为空队列,将第一结点值赋给e,头结点指向第一结点的下一结点,释放头结点,队列计数减一
/* 出队操作 @params Q 队列指针 @params e 接收对象指针 */ Status DeQueue(QueueList *Q,ElemType *e) { QueueNode n; if(Q->rear == Q->front) return ERROR; n = Q->front->next; *e = n->data; Q->front->next = n->next; free(n); Q->length --; return OK; }