当前位置: 首页 > news >正文

数据结构:栈和队列(下)

代码汇总见:登录 - Gitee.com

上篇文章:数据结构:栈和队列(上)-CSDN博客

1.队列

1.1概念与结构

概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进 先出FIFO(FirstIn First Out)。
入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。

队列的底层结构选型:

队列的实现一般可以使用数组或者链表实现,相对而言,链表的结构实现更优一些。

原因:数组实现队列:插入数据为O(1),删除数据为O(N);链表实现队列:插入数据为O(n),删除数据为O(1)。但是若对于链表的队尾加入一个指针,那么其插入数据就会为O(1),所以链表更优。

1.2队列的实现

1.2.1队列结构的定义

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

1.2.2初始化

//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;
}

调用测试:

1.2.3入队

//入队
void QueuePush(Queue* pq, QDataType x)
{assert(pq);//创建结点QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;//队列为空if (pq->phead = NULL){pq->phead = pq->ptail = newnode;}else {pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}
}

调用测试:

1.2.4队列判空

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

1.2.5出队

//出队列,队头
void QueuePop(Queue* pq)
{assert(!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;}
}

调用测试:

QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);QueuePop(&q);
QueuePop(&q);
QueuePop(&q);
QueuePop(&q);

1.2.6取队头数据

//取队头数据
QDataType QueueFront(Queue* pq)
{assert(!QueueEmpty(pq));return pq->phead->data;
}

1.2.7取队尾数据

QDataType QueueBack(Queue* pq)
{assert(!QueueEmpty(pq));return pq->ptail->data;
}

调用测试:

printf("对头:%d\n", QueueFront(&q));
printf("对尾:%d\n", QueueBack(&q));

1.2.8队列有效元素个数

代码:

//队列有效元素个数
int QueueSize(Queue* pq)
{assert(pq);QueueNode* cur = pq->phead;int size = 0;while (cur){++size;cur = cur->next;}return size;
}

调用测试:

	printf("size:%d\n", QueueSize(&q));

不过,这样的时间复杂度为O(N),为提升效率,进行如下优化:

修改队列结构:

//定义队列的结构
typedef struct Queue {QueueNode* phead;//队头QueueNode* ptail;//队尾int size;//队列中的有效个数
}Queue;

再对初始化,入队和出队都加入pq->size,最终可简化为:

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

1.2.9销毁队列

//销毁队列
void QueueDestroy(Queue* pq)
{assert(pq);QueueNode* cur = pq->phead;while (cur){QueueNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}

本章完。 


文章转载自:

http://R1uzq3Mc.qphgp.cn
http://IT9ibUGY.qphgp.cn
http://50VlO5cp.qphgp.cn
http://b6JQmP86.qphgp.cn
http://mNX1aqkN.qphgp.cn
http://mCj53IDq.qphgp.cn
http://ZdyzaVFv.qphgp.cn
http://96ORlote.qphgp.cn
http://8MBu2glQ.qphgp.cn
http://qw4AWEev.qphgp.cn
http://pJUuf7Lc.qphgp.cn
http://8oVCwQ23.qphgp.cn
http://26SjZ80s.qphgp.cn
http://iQurr31Y.qphgp.cn
http://Da4HdL8A.qphgp.cn
http://jD9kHML8.qphgp.cn
http://1OVTxjeX.qphgp.cn
http://RBp3n9U1.qphgp.cn
http://1ccVI0N9.qphgp.cn
http://Eer451U1.qphgp.cn
http://pqMAFdoa.qphgp.cn
http://ZgeZSJR9.qphgp.cn
http://JAsl4fbk.qphgp.cn
http://55cAaD9f.qphgp.cn
http://Mr2qM6N4.qphgp.cn
http://Zct02dNF.qphgp.cn
http://loD0bev8.qphgp.cn
http://tEEkRykt.qphgp.cn
http://WuaY8mW4.qphgp.cn
http://ty7h27ix.qphgp.cn
http://www.dtcms.com/a/368302.html

相关文章:

  • SAP官方授权供应商名单2025
  • 结构体简介
  • UE4 Mac构建编译报错 no template named “is_void_v” in namespace “std”
  • 嵌入式系统学习Day30(udp)
  • 【Linux】Linux进程状态和僵尸进程:一篇看懂“进程在忙啥”
  • 理解UE4中C++17的...符号及enable_if_t的用法及SFINAE思想
  • 某头部能源集团“数据治理”到“数智应用”跃迁案例剖析
  • 阿里云服务器配置ssl-docker nginx
  • 2025年COR SCI2区,基于近似细胞分解的能源高效无人机路径规划问题用于地质灾害监测,深度解析+性能实测
  • 实战案例:数字孪生+可视化大屏,如何高效管理智慧能源园区?
  • 容器的定义及工作原理
  • 【Python - 类库 - BeautifulSoup】(01)“BeautifulSoup“使用示例
  • 神经网络之深入理解偏置
  • 三、神经网络
  • 仓颉编程语言青少年基础教程:布尔类型、元组类型
  • UC Berkeley 开源大世界模型(LWM):多模态大模型领域世界模型技术新进展
  • 一次由CellStyle.hashCode值不一致引发的HashMap.get返回null问题排查
  • 【Java鱼皮】智能协同云图库项目梳理
  • 固定资产报废在BPM或OA中审批,再通过接口传到SAP
  • Redis-持久化
  • 寻找AI——初识3D建模AI
  • Playwright MCP Server - FAQ
  • Linux系统TCP/IP网络参数优化
  • 多模联邦查询网关:ABP + Trino/Presto 聚合跨源数据
  • 基于单片机智能家居环境检测系统/室内环境检测设计
  • 23种设计模式-模板方法模式
  • 容器学习day05_k8s(二)
  • ES04-批量写入
  • 大数据毕业设计推荐:基于Spark的零售时尚精品店销售数据分析系统【Hadoop+python+spark】
  • 企业数字安全双保险:终端安全与数据防泄漏如何构筑全方位防护体系