队列的相关知识

 

1、队列数据类型的特点是先进先出。

可以用顺序结构通过数组来实现,也可以用链表来实现。今天就拿链表来举例。

首先是需要明确的一些必备操作。

1、队列的初始化

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>



//表示链表节点的类型
struct node
{
	int data;
	struct node *next;
};


//表示队列的基本信息
struct queue
{
	struct node *first;  //第一个节点的地址
	struct node *tail ;  //最后一个节点的地址
	int  len; // 队列的长度
	int  count;  //队列的实际长度
};
/队列的初始化
void queue_init(struct queue *pq, int n)
{
	pq->first = NULL;
	pq->tail = NULL;
	pq->len = n;
	pq->count = 0;
}

先定义一个结构体用来保存数据,为了方便链表操作在定义一个结构体来表示这个队列第一个节点和最后一个节点。

队列的初始化。

如何判断队列为空呢?


//判断队列是否为空
bool is_empty(struct queue q1)
{
	if(q1.first == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

判断队列是否已满

//判断队列是否已满
bool is_full(struct queue q1)
{
	if(q1.len == q1.count)
	{
		return true;
	}
	else
	{
		return false;
	}
}

入队(尾部追加)

bool queue_push(struct queue *pq, int data)
{
	//判断队列是否已满
	if(is_full(*pq))
	{
		printf("入队失败,队列已满!\n");
		return false;
	}
	
	//正确入队操作
	struct node *pnew = NULL;
	pnew = (struct node*)malloc(sizeof(struct node));
	assert(pnew!=NULL);
	pnew->data = data;
	pnew->next = NULL;

	if(pq->first == NULL) //pnew 是队列的第一个节点
	{
		pq->first = pnew;
		pq->tail = pnew;
	}
	else //队列是一个非空的队列
	{
		pq->tail->next = pnew;
		pq->tail = pnew;
	}
	pq->count ++;
	return true;
}

//出队(头部删除)
bool queue_pop(struct queue *pq, int *pdata)
{
	//判断队列是否为空
	if(is_empty(*pq))
	{
		printf("出队失败,队列为空!\n");
		return false;
	}

	//正常出队操作
	struct node *pdel = NULL;
	pdel = pq->first;
	if(pdata != NULL)  //返回出队的数据
	{
		*pdata = pdel->data;
	}

	if(pq->first->next  == NULL)  //队列只有一个节点
	{
		pq->first = NULL;
		pq->tail = NULL;
		free(pdel);
	}
	else  //多个节点
	{
		pq->first = pdel->next;
		free(pdel);
	}

	pq->count --;
	return true;
}
int main()
{
	struct queue  q1;

	queue_init(&q1, 5);

	queue_push(&q1, 2);
	queue_push(&q1, 4);
	queue_push(&q1, 6);
	queue_push(&q1, 8);


	int data;

	queue_pop(&q1, &data);
	printf("Data: %d\n", data);
	queue_pop(&q1, &data);
	printf("Data: %d\n", data);
	queue_pop(&q1, &data);
	printf("Data: %d\n", data);
	queue_pop(&q1, &data);
	printf("Data: %d\n", data);
	
	queue_pop(&q1, &data);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值