数据结构——队列

【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
链式队列特点:
一、只允许在表的前端(front)进行删除,而在表的后端(rear)进行插入。
二、队列中没有元素时,称为空队列。

三、链式队列可以没有队满,但是我们可以人为的指定个最大值。

一、Queue_List.cpp

#include <stdio.h>
#include <stdlib.h>
#include <error.h>

#include "Queue_List.h"

static void CopyToNode(Item item, Node *pn);
static void CopyToItem(Node *pn, Item *pi);

/*初始化一个队列*/
void InitializeQueue(Queue *pq)
{
	pq->front  = pq->rear = NULL;
	pq->items = 0;
}

/*队列是否已满*/
bool QueueISfull(const Queue *pq)
{
	return pq->items == MAXQUEUE;
}

/*判断队列是否为空*/
bool QueueIsEmpty(const Queue *pq)
{
	return pq->items == 0;
}

/*返回队列个数*/
int QueueItemCout(const Queue *pq)
{
	return pq->items;
}

/*入队操作*/
int EnQueue(Item item, Queue *pq)
{
	Node *pnew;
	
	if(QueueISfull(pq))
	{
		return false;
	}
	pnew = (Node *)malloc(sizeof(Node));
	if(pnew == NULL)
	{
		fprintf(stderr, "Unable to allocate memory\n");
		exit(1);
	}
	
	CopyToNode(item, pnew);
	pnew->next = NULL;
	
	if(QueueIsEmpty(pq)) //第一个节点
		pq->front = pnew;
	else
		pq->rear->next = pnew;
	
	pq->rear = pnew;     //调整队尾指针
	pq->items++;         //队列数加一
	
	return true;
}

/*出队操作*/
bool DeQueue(Item *pitem, Queue *pq)
{
	Node *pt;
	
	if(QueueIsEmpty(pq))
		return false;
	CopyToItem(pq->front, pitem); //数据拷贝
	
	pt = pq->front;               //保存一下队头
	pq->front = pq->front->next;  //调整队头指针位置
	free(pt);                     //释放节点
	pq->items--;                  //队列数目减一
	
	if(QueueIsEmpty(pq))
		pq->rear = NULL;
	
	return true;
}

/*清空队列*/
void EmptyTheQueue(Queue *pq)
{
	Item dummy;
	while(!QueueIsEmpty(pq))
		DeQueue(&dummy, pq);
}

static void CopyToNode(Item item, Node *pn)
{
	pn->item = item;
}

static void CopyToItem(Node *pn, Item *pi)
{
	*pi = pn->item;
}


二、Queue_List.h
#ifndef   QUEUE_LIST_H_
#define   QUEUE_LIST_H_
#include  <stdbool.h>     //bool类型支持   
#define   MAXQUEUE  10

typedef int Item;         // 自定义数据域数据类型
typedef struct node
{
	Item item;            //数据域
	struct node *next;    //指针域
}Node;

typedef struct queue
{
	Node *front;          //指向队列列首指针
	Node *rear;           //指向队列列尾指针
	int items;            //队列中个数
}Queue;


/*
** 函数介绍:初始化一个空队列
** 参数介绍:Queue *pq:队列指针
** 返回值:  
*/
void InitializeQueue(Queue *pq);

/*
** 函数介绍:判断队列是否已满即等于最大队列数MAXQUEUE。
** 参数介绍:const Queue *pq:队列指针。
** 返回值:  返回值1已满,返回值0未满。
*/
bool QueueISfull(const Queue *pq);

/*
** 函数介绍:判断队列是否已空即items等于0。
** 参数介绍:const Queue *pq:队列指针。
** 返回值:  返回值1为空,返回值0非空。
*/
bool QueueIsEmpty(const Queue *pq);

/*
** 函数介绍:确定队列中项目的个数
** 参数介绍:const Queue *pq:队列指针。
** 返回值:  
*/
int QueueItemCout(const Queue *pq);

/*
** 函数介绍:向队尾端添加项目
** 参数介绍:Queue *pq:队列指针。
**			 Item item:需要添加的数据域
** 返回值:  成功返回1,失败返回0。
*/
int EnQueue(Item item, Queue *pq);

/*
** 函数介绍:从队首删除一个项目
** 参数介绍:Queue *pq:队列指针。
**           Item *pitem:需要取出的数据域存放地址
** 返回值:  成功返回1,失败返回0。
*/
bool DeQueue(Item *pitem, Queue *pq);

/*
** 函数介绍:清空队列
** 参数介绍:Queue *pq:队列指针。
** 返回值:  void
*/
void EmptyTheQueue(Queue *pq);

#endif


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值