数据结构——队列

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值