什么是队列?
队列是一种特殊的线性表,特殊在于只能固定在两端工作,尾插,头取
1.队列的操作方式:
1.队头,可以删除节点的一端
2.队尾,可以插入节点
3.插入数据,只能从队尾插入,对应的接口 InQueue()
4.删除数据,只能从队头删除,对应的接口 OutQueue()
5.取队头, 获取队列的第一个元素,对应的接口为 GetHead()
其实队列就是一个特殊的单向链表
2.队列的存储方式:
顺序存储(数组),链式存储
3.队列接口封装:
typedef int dataType;
//-----------------------
// 数据域
dataType data;
// 指针域
struct node *next;
};
// 队列管理结构体
typedef struct
{
// 指向对头的指针
struct node *first;
// 指向队尾的指针
struct node *last;
// 记录节点数
int nodeNumber;
}LinkedQueue;
链式队列接口
/* 初始化一个队列 */
LinkedQueue *Init_Queue();
/* 反初始化一个队列 */
void DeInit_Queue(LinkedQueue *Lq);
/* 判断队列是否为空 如果为空返回1,否则返回0,异常返回-1*/
int QueueIsEmpty(LinkedQueue *Lq);
/* 返回队列的长度 */
int QueueLen(LinkedQueue *Lq);
/* 获取队列的首节点元素 */
dataType GetHead(LinkedQueue *Lq);
/* 入队 (尾插法)*/
bool InQueue(LinkedQueue *Lq,dataType data);
/* 出队 (头取法) */
dataType OutQueue(LinkedQueue *Lq);
/* 清空队列 */
void Clear_Queue(LinkedQueue *Lq);
具体代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//-------------------------
typedef int dataType;
//-------------------------
struct node
{
// 数据域
dataType data;
// 指针域
struct node *next;
};
//-------------------------
// 队列管理结构体
typedef struct
{
// 指向对头的指针
struct node *first;
// 指向队尾的指针
struct node *last;
// 记录节点数
int nodeNumber;
}LinkedQueue;
/* 接口声明 */
/* 初始化一个队列 */
LinkedQueue *Init_Queue();
/* 反初始化一个队列 */
void DeInit_Queue(LinkedQueue *Lq);
/* 判断队列是否为空 如果为空返回1,否则返回0,异常返回-1*/
int QueueIsEmpty(LinkedQueue *Lq);
/* 返回队列的长度 */
int QueueLen(LinkedQueue *Lq);
/* 获取队列的首节点元素 */
dataType GetHead(LinkedQueue *Lq);
/* 入队 (尾插法)*/
bool InQueue(LinkedQueue *Lq,dataType data);
/* 出队 (头取法) */
dataType OutQueue(LinkedQueue *Lq);
/* 清空队列 */
void Clear_Queue(LinkedQueue *Lq);
//-------------------------
/* 初始化一个队列 */
LinkedQueue *Init_Queue()
{
LinkedQueue *Lq = malloc(sizeof(LinkedQueue));
if(Lq == NULL)
return NULL;
Lq->first = NULL;
Lq->last = NULL;
Lq->nodeNumber = 0;
return Lq;
}
//-------------------------
/* 反初始化一个队列 */
void DeInit_Queue(LinkedQueue *Lq)
{
if(Lq)
{
struct node *p = Lq->first;
while(p)
{
Lq->first = Lq->first->next;
p->next = NULL;
free(p);
p = Lq->first;
}
Lq->last = NULL;
Lq->nodeNumber = 0;
free(Lq);
}
}
//-------------------------
/* 判断队列是否为空 如果为空返回1,否则返回0,异常返回-1*/
int QueueIsEmpty(LinkedQueue *Lq)
{
if(Lq)
{
return Lq->nodeNumber == 0; // 如果Lq->nodeNumber==0返回1否则返回0
}
return -1;
}
//-------------------------
/* 返回队列的长度 */
int QueueLen(LinkedQueue *Lq)
{
if(Lq)
{
return Lq->nodeNumber;
}
return -1;
}
//-------------------------
/* 获取队列的首节点元素 */
dataType GetHead(LinkedQueue *Lq)
{
if(Lq && Lq->first)
{
return Lq->first->data;
}
return -1;
}
//-------------------------
/* 入队 (尾插法)*/
bool InQueue(LinkedQueue *Lq,dataType data)
{
if(Lq)
{
// 给数据节点分配空间
struct node *pnew = malloc(sizeof(struct node));
if(pnew == NULL)
return false;
// 初始化新节点
pnew->data = data;
pnew->next = NULL;
// 如果队列管理节点指向的数据节点为空
if(Lq->first == NULL)
{
Lq->first = pnew;
Lq->last = pnew;
}
else // 尾插法
{
Lq->last->next = pnew;
Lq->last = pnew;
}
Lq->nodeNumber++;
return true;
}
return false;
}
//-------------------------
/* 出队 (头取法) */
dataType OutQueue(LinkedQueue *Lq)
{
if(Lq && Lq->first)
{
// 定义遍历指针p指向首节点
struct node *p = Lq->first;
// 定义变量临时存放取到的节点数据
dataType data = p->data;
// 队列首指针指向下一个节点
Lq->first = Lq->first->next;
// 释放原首节点
free(p);
// 节点数减一
Lq->nodeNumber--;
// 如果没有节点
if(Lq->nodeNumber == 0)
{
Lq->last = NULL;
}
return data;
}
return -1;
}
//-------------------------
/* 清空队列 */
void Clear_Queue(LinkedQueue *Lq)
{
if(Lq)
{
struct node *p = Lq->first;
while(p)
{
Lq->first = Lq->first->next;
p->next = NULL;
free(p);
p = Lq->first;
}
Lq->last = NULL;
Lq->nodeNumber = 0;
}
}
//-------------------------
int main()
{
// 初始化队列
LinkedQueue *Lq = Init_Queue();
if(Lq == NULL)
{
perror("init queue failed:");
return -1;
}
while(1)
{
dataType data;
scanf("%d",&data);
if(data == 0)
break;
//入队
bool ret = InQueue(Lq,data);
if(ret == false)
{
perror("inQueue failed:");
return -1;
}
}
// 出队
while(!QueueIsEmpty(Lq))
{
printf("%d ", OutQueue(Lq));
}
printf("\n");
return 0;
}