【数据结构与算法】第7课—数据结构之队列

文章目录

  • [1. 队列](#1. 队列)
    • [1.1 什么是队列](#1.1 什么是队列)
    • [1.2 队列的结构](#1.2 队列的结构)
    • [1.3 队列初始化](#1.3 队列初始化)
    • [1.4 队列入栈](#1.4 队列入栈)
    • [1.5 出队列](#1.5 出队列)
    • [1.6 查找队列有效元素个数](#1.6 查找队列有效元素个数)
    • [1.7 取队头和队尾数据](#1.7 取队头和队尾数据)
    • [1.8 销毁链表](#1.8 销毁链表)
  • [2. 用两个队列实现栈](#2. 用两个队列实现栈)
  • [3. 用两个栈实现队列](#3. 用两个栈实现队列)
  • [4. 循环队列](#4. 循环队列)

1. 队列

  • 注:文中Queue是队列,Quene是错误写法

1.1 什么是队列

  • 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
  • 栈只允许在栈顶进行插入数据删除数据的操作,称为入栈、出栈(或压栈)
  • 队列则是队尾进队头出,满足先进先出的原则,而栈则是后进先出

1.2 队列的结构


c 复制代码
typedef int QueueDataType;
//定义队列节点的结构
typedef struct QueueNode
{
	QueueDataType data;
	struct QueueNode* next;
}QueueNode;

//定义队列的结构
typedef struct Queue
{
	QueueNode* phead;//队头
	QueueNode* ptail;//队尾
}Queue;

1.3 队列初始化


1.4 队列入栈


c 复制代码
//入队列
void QueuePush(Queue* pq, QueueDataType x)
{
	assert(pq);
	//申请节点
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode== NULL)
	{
		perror("malloc fail!\n");
		exit(1);
	}
	newnode->data = x;
	newnode->next = NULL;
	//队列为空,队头队尾都是newnode
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	//队列不为空
	else
	{
		pq->ptail->next = newnode;
		//pq->ptail往后走
		pq->ptail = pq->ptail->next;
	}
}

1.5 出队列


c 复制代码
//队列判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->phead == NULL;
}

//出队列--头删
void QueuePop(Quene* pq)
{
	assert(pq && !QueueEmpty(pq));
	//队列只有一个有效数据
	if (pq->phead == pq->ptail)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	//队列有多个有效数据
	else
	{
		QueueNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
		
}

1.6 查找队列有效元素个数


c 复制代码
//查找队列有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);
    //第一种
	//int size = 0;
	//QueueNode* pcur = pq->phead;
	//while (pcur)
	//{
	//	size++;
	//	pcur = pcur->next;
	//}
	//return size;

	//第二种
	return pq->size;
}

1.7 取队头和队尾数据


1.8 销毁链表


2. 用两个队列实现栈

  • 栈的结构

  • 栈的初始化

  • 入栈

  • 出栈----取栈顶元素

  • 返回栈顶元素

  • 判断栈是否为空和销毁栈

3. 用两个栈实现队列


  • 自定义的队列的数据结构

  • 队列的初始化

  • 入队和出队


  • 判断队列是否为空和销毁队列

4. 循环队列


  • 循环队列初始化

  • 判断循环队列是否为空和循环队列是否满了

  • 循环队列插入元素

  • 循环队列出队列

  • 循环队列取队头和队尾

  • 释放循环队列

相关推荐
夜不会漫长12 小时前
C++:红黑树
数据结构·算法
冻柠檬飞冰走茶15 小时前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c15 小时前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶15 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
PaperAccept21 小时前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算
Tairitsu_H21 小时前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
数据结构·c++·图论
Tairitsu_H1 天前
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?
数据结构·c++·图论·最小生成树
D e re k ZH2 天前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
La Pulga2 天前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
番茄味城市甜菜2 天前
数据结构:双向链表实现,链表与顺序表的对比
数据结构·链表