1. 简介
和栈相反,
队列(queue)是一种
先进先出(first in first out,缩写为FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫做
队尾(rear),允许删除的一端称为
队头(front)。假设队列为q = (a1, a2, ..., an),那么a1就是队头元素,an是队尾元素。队列中的元素是按照a1, a2, ... , an的顺序进入的,退出队列也只能按照这个次序依次退出,也就是说,只有在a1, a2, ... , an-1都离开队列之后an才能退出队列。
2. 链队列的实现
下面是队列的
链式实现,当然还有另一种实现
循环队列,这里就不再说明。
/*********************************************************************************
*Copyright(C),Your Company
*FileName: queue.h
*Author: Huangjh
*Version:
*Date: 2018-01-22
*Description: 链队列(C语言)的实现
*Others:
**********************************************************************************/
#ifndef _QUEUE_H
#define _QUEUE_H
#define QUEUE_TRUE 0
#define QUEUE_FALSE -1
typedef int QElemType;
typedef struct _QNode_t
{
QElemType data;
struct _QNode_t *pNext;
}QNode;
typedef struct
{
QNode *pFront; //队头指针
QNode *pRear; //队尾指针
}LinkQueue;
int InitQueue(LinkQueue *pQueue);
void DestroyQueue(LinkQueue *pQueue);
int EmptyQueue(LinkQueue *pQueue);
int EnQueue(LinkQueue *pQueue, QElemType elem);
int DeQueue(LinkQueue *pQueue, QElemType *pElem);
#endif //#ifndef _QUEUE_H
/*********************************************************************************
*Copyright(C),Your Company
*FileName: queue.cpp
*Author: Huangjh
*Version:
*Date: 2018-01-22
*Description: 链队列(C语言)的实现
*Others:
**********************************************************************************/
#include <stdlib.h>
#include <assert.h>
#include "queue.h"
//构造一个空队列
int InitQueue(LinkQueue *pQueue)
{
assert(pQueue != NULL);
pQueue->pFront = pQueue->pRear = (QNode *)malloc(sizeof(QNode));
if (pQueue->pFront == NULL)
{
abort();
}
pQueue->pFront->pNext = NULL;
return QUEUE_TRUE;
}
//销毁一个队列
void DestroyQueue(LinkQueue *pQueue)
{
assert(pQueue != NULL);
while (pQueue->pFront)
{
pQueue->pRear = pQueue->pFront->pNext;
free(pQueue->pFront);
pQueue->pFront = pQueue->pRear;
}
}
//判断队列是否是空
int EmptyQueue(LinkQueue *pQueue)
{
return pQueue->pFront == pQueue->pRear;
}
//插入到队尾
int EnQueue(LinkQueue *pQueue, QElemType elem)
{
assert(pQueue != NULL);
QNode *pQNewNode = (QNode *)malloc(sizeof(QNode));
if (pQNewNode == NULL)
{
abort();
}
pQNewNode->data = elem;
pQNewNode->pNext = NULL;
pQueue->pRear->pNext = pQNewNode;
pQueue->pRear = pQNewNode;
return QUEUE_TRUE;
}
//从队头删除
int DeQueue(LinkQueue *pQueue, QElemType *pElem)
{
assert(pQueue != NULL);
if (pQueue->pFront == pQueue->pRear)
return QUEUE_FALSE;
QNode *pQueueHead = pQueue->pFront->pNext;
*pElem = pQueueHead->data;
pQueue->pFront->pNext = pQueueHead->pNext;
if (pQueue->pRear == pQueueHead)
{
pQueue->pRear = pQueue->pFront;
}
free(pQueueHead);
return QUEUE_TRUE;
}
/*********************************************************************************
*Copyright(C),Your Company
*FileName: main.cpp
*Author: Huangjh
*Version:
*Date: 2018-01-22
*Description: 链队列(C语言)的测试程序
*Others:
**********************************************************************************/
#include <stdio.h>
#include "queue.h"
int main(void)
{
LinkQueue stLinkQueue;
InitQueue(&stLinkQueue);
for (int i = 0; i < 10; i++)
{
EnQueue(&stLinkQueue, i);
}
while (!EmptyQueue(&stLinkQueue))
{
QElemType elemTemp;
DeQueue(&stLinkQueue, &elemTemp);
printf("出队列:%d.\r\n", elemTemp);
}
DestroyQueue(&stLinkQueue);
return 0;
}
运行结果如下所示:
出队列:0.
出队列:1.
出队列:2.
出队列:3.
出队列:4.
出队列:5.
出队列:6.
出队列:7.
出队列:8.
出队列:9.