8月26日笔记数据结构队列

什么是队列?
    队列是一种特殊的线性表,特殊在于只能固定在两端工作,尾插,头取

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;
}


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值