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