【数据结构入门 】队列

目录

前言

一、队列的概念及结构

1.概念

2.结构

二、队列的实现

1.队列的声明

2.初始化队列

 3.队列的销毁

 4.入队

5.出队

 6.获取队列有效元素个数

7. 判断队列是否为空

8.获取队首元素

 9.获取队尾元素

结论


前言

        队列是一种数据结构,它遵循先进先出(FIFO)的原则。这意味着最先进入队列的元素将最先被处理或移除,而最后进入队列的元素将最后被处理或移除。

        队列的基本操作包括入队(向队列尾部添加元素)出队(从队列头部移除元素)

一、队列的概念及结构

1.概念

队列是一种具有先进先出(FIFO)特性的数据结构。它类似于在超市排队购物时的情景,新来的人只能排在队尾,而离开队伍的人是从队首开始。在队列中,元素按照插入的顺序排列,并且只能在队尾添加新元素,而只能在队首删除元素。这使得队列成为处理按照先后顺序排列的数据的理想选择。

队列有两个主要操作:入队(enqueue)和出队(dequeue)。入队操作将元素添加到队尾,出队操作将队首的元素删除并返回。除此之外,队列还可以支持其他操作,如获取队首元素、判断队列是否为空等。

队列在计算机科学中广泛应用,例如任务调度、消息传递、缓冲区管理等领域。在编程中,队列通常使用数组或链表来实现。

2.结构

二、队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。

1.队列的声明

使用链表结构,要返回多个参数,所以使用结构体封装。

 

typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;

2.初始化队列

 

void QueueInit(Queue* pq)
{
	assert(pq);

	pq->head = pq->tail = NULL;
	pq->size = 0;
}

 3.队列的销毁

void QueueDestory(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

 4.入队

void QueuePush(Queue* pq, QDataType x)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;

	//没有结点插入时
	if (pq->head == NULL)
	{
		assert(pq->tail == NULL);

		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

5.出队

void QueuePop(Queue* pq)
{
	assert(pq && pq->head);
	
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
	pq->size--;
}

 6.获取队列有效元素个数

int QueueSize(Queue* pq)
{
	assert(pq);
	
	return pq->size;
}

7. 判断队列是否为空

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

8.获取队首元素

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->data;
}

 9.获取队尾元素

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->data;
}

结论

队列和栈的区别:

  1. 数据操作方式:队列是先进先出,栈是后进先出。
  2. 插入和删除操作:队列的插入操作是在队尾进行,删除操作是在队头进行;栈的插入和删除操作都是在栈顶进行。
  3. 访问限制:队列只能访问队头和队尾元素,不能访问队列中间的元素;栈只能访问栈顶元素。
  4. 应用场景:队列常用于需要按顺序处理数据的场景,如任务调度、消息队列等;栈常用于需要后进先出的场景,如表达式求值、函数调用等。

在实际应用中,队列和栈经常结合使用,例如使用栈来实现队列,或者使用队列来实现栈。它们是解决问题的重要工具,根据具体的场景和需求选择合适的数据结构是很重要的。

  • 40
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值