数据结构之队列

队列:一种先进先出的数据结构,在队尾插入数据,在队头弹出数据

下面详细介绍队列的顺序存储和链式存储实现:

顺序存储

//顺序队列结构体
typedef struct SEQQUEUE {
	void* data[MAX_SIZE];
	int size;
}SeqQueue;

//初始化队列
SeqQueue* init_SeqQueue() {
	SeqQueue* queue = (SeqQueue*)malloc(sizeof(SeqQueue));
	for (int i = 0; i < MAX_SIZE; i++)
	{
		queue->data[i] = NULL;
	}
	queue->size = 0;
	return queue;
}

//入队列
void push_SeqQueue(SeqQueue* queue, void *data)
{
	if (!queue || !data)
	{
		return;
	}
	if (queue->size == MAX_SIZE)
	{
		return;
	}
	queue->data[queue->size] = data;
	queue->size++;
}

//返回队列头元素
void* front_SeqQueue(SeqQueue* queue)
{
	if (!queue)
	{
		return NULL;
	}
	if (queue->size == 0)
	{
		return NULL;
	}
	return queue->data[0];
}
//返回队列尾元素
void* back_SeqQueue(SeqQueue* queue)
{
	if (!queue)
	{
		return NULL;
	}
	if (queue->size == 0)
	{
		return NULL;
	}
	return queue->data[queue->size - 1];
}
//出队列
void pop_SeqQueue(SeqQueue* queue)
{
	if (!queue)
	{
		return ;
	}
	if (queue->size == 0)
	{
		return;
	}
	for (int i = 0; i < queue->size - 1; i++)
	{
		queue->data[i] = queue->data[i + 1];
	}

	queue->size--;
}	

下面是测试代码:
typedef struct PERSON {
	int age;
	char name[64];
}Person;

void seqQueueTest()
{
	Person p1, p2, p3, p4;
	p1.age = 10;
	p2.age = 20;
	p3.age = 30;
	p4.age = 40;
	SeqQueue* queue = init_SeqQueue();
	push_SeqQueue(queue,&p1);
	push_SeqQueue(queue, &p2);
	push_SeqQueue(queue, &p3);
	push_SeqQueue(queue, &p4);
	
	while (queue->size > 0)
	{
		//返回队列头元素
		Person* person =(Person*)front_SeqQueue(queue);
		printf("front person age=%d\n", person->age);
		person = (Person*)back_SeqQueue(queue);
		printf("back person age=%d\n", person->age);

		//出队列
		pop_SeqQueue(queue);
	}
}

链式存储

//链表结点定义
typedef struct LINKNODE {
	struct LINKNODE* next;
}LinkNode;

//链式存储队列
typedef struct LINKQUEUE {
	LinkNode head;
	int size;
}LinkQueue;

//初始化队列
LinkQueue* init_LinkQueue()
{
	LinkQueue* queue = (LinkQueue*)malloc(sizeof(LinkQueue));
	queue->head.next = NULL;
	queue->size = 0;
	return queue;
}

//队尾入队列
void push_LinkQueue(LinkQueue* queue, LinkNode* data)
{
	if (!queue || !data)
	{
		return;
	}
	if (queue->size == 0)
	{
		data->next = NULL;
		queue->head.next = data;
		queue->size++;
		return;
	}

	LinkNode* pNext = queue->head.next;
	for (int i = 0; i < queue->size - 1; i++)
	{
		pNext = pNext->next;
	}

	data->next = NULL;
	pNext->next = data;
	queue->size++;
}

//返回队列头元素
LinkNode* front_LinkQueue(LinkQueue* queue)
{
	if (!queue) {
		return NULL;
	}
	if (queue->size == 0)
	{
		return NULL;
	}
	return queue->head.next;
}

//返回队列尾元素
LinkNode* back_LinkQueue(LinkQueue* queue)
{
	if (!queue) {
		return NULL;
	}
	if (queue->size == 0)
	{
		return NULL;
	}

	LinkNode* pNext = queue->head.next;
	for (int i = 0; i < queue->size - 1; i++)
	{
		pNext = pNext->next;
	}
	return pNext;
}

void pop_LinkQueue(LinkQueue* queue)
{
	if (!queue) {
		return;
	}
	if (queue->size == 0)
	{
		return;
	}
	queue->head.next = queue->head.next->next;
	queue->size--;
}

下面是测试代码
typedef struct PERSONQUEUE {
	LinkNode head;
	int age;
	char name[64];
}PersonQueue;

void linkQueueTest()
{
	LinkQueue* queue = init_LinkQueue();

	PersonQueue p1, p2, p3;
	strcpy(p1.name, "p1");
	strcpy(p2.name, "p2");
	strcpy(p3.name, "p3");
	p1.age = 10;
	p2.age = 20;
	p3.age = 30;

	push_LinkQueue(queue, (LinkNode*)&p1);
	push_LinkQueue(queue, (LinkNode*)&p2);
	push_LinkQueue(queue, (LinkNode*)&p3);

	PersonQueue* p=(PersonQueue*)back_LinkQueue(queue);
	printf("queue back data name=%s, and age=%d\n",p->name, p->age);

	while (queue->size > 0)
	{
		PersonQueue* p = (PersonQueue*)front_LinkQueue(queue);
		printf("queue front data name=%s, and age=%d\n", p->name, p->age);
		pop_LinkQueue(queue);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值