网易首页 > 网易号 > 正文 申请入驻

数据结构与算法-栈与队列

0
分享至

使用抽象数据类型可以帮助我们更好的理解数据所需的操作,之后再进行具体的数据类型实现。实际上,往往是操作影响着我们决定数据类型该如何实现,这里有两种典型的数据结构-栈和队列。

本质上,栈和队列都是线性表,只是根据操作的需求我们人为地在线性表上加上限制,形成了两种具有独特功能的数据结构。

1、栈

首先,普通的线性表实现是有两个端口可以访问的,但是如果作为栈就要封闭一端,只能访问另一端。这当然不是自讨苦吃,栈是一种抽象数据结构,是对现实世界对象的模拟。比如,自助餐厅中的一叠盘子,新盘子放在这一叠盘子的最上面,取得时候也是从最上面取。将其抽象出来就是栈,这是最合适的抽象方式。

基于栈的操作非常简单:

  • 将数据压入栈顶-push
  • 将栈顶数据弹出-pop
  • 查看栈顶数据-top

栈的实现不是难点,基于栈的操作也很简单,重点是栈的运用。

动态图:

栈的先进后出规则,本质上代表着数据的次序,常见的二叉树先序、中序、后序非递归遍历,其实就是借用这种规则实现的。想要深入理解栈,没有取巧的方法,见多识广用在这里再合适不过了,这里使用一个简单的例子来加深对栈的理解。

大整数加法,现在有个需求,将1856845129568452684和8948756841235879相加,怎么处理?这两个整数太大了,寻常的整数类型根本无法存储他们,更别说他们相加的结果。为了解决这个问题,可以将这种非常大的数看成一串数字,分别存到两个栈中,然后从栈中弹出数,进行加法操作。

伪代码如下:

简单起见,这里给出456和7891相加时栈的结构:

这不就是我们学过的加法计算公式嘛,是的,这里使用栈模拟了加法过程。

将数字压入栈中,其实维持了千位、百位、十位、个位之间的次序,正是这个原因才能保证栈弹出的时候数字相加是合理的。这只是栈简单的一种运用,在现实生活中,所有需要保持次序的数据,都可以使用栈这种先进后出的结构,通过巧妙的设计完成算法逻辑。

2、队列

队列是一种简单的等待序列,在尾部加入元素时队列加长,在前端删除数据时队列缩短。与栈不同,队列是一种使用两端的结构:一端用来加入新元素,另一端用来删除元素。队列是先进先出的结构。

队列的操作与栈操作相似:

  • 在队列尾部加入元素-enqueue(el)
  • 取出队列的第一个元素-dequeue()
  • 查看队列头部元素-firstEI()

动态图:

队列的实现:

队列的一种可能实现方式是使用数组,但这并非最佳选择。元素从队尾加入而从队首删除,这会释放数组中的某些单元,这些单元不应该浪费。一种可能的做法是使用循环数组,如果队尾已满而队首有空的单元,可以将新加元素放入队首,形成循环数组,这种做法是空间比较紧张时的无奈之举,因为它破坏了队列的简单易用性,所以不推荐。

队列的另一种可能实现是使用双向链表,那么执行入队列和出队列操作仅需要常数时间,并且没有数组实现中空间的浪费,因此,推荐这种方法。

队列的变种:

  • 优先队列

在许多情况下,简单的队列结构是不够的,先入先出机制需要使用某些优先规则来完善。在邮政局中,残疾人应该比其他人享有一定的优先权。在进程队列中,由于系统的功能需求,即使在等待队列中进程P1在P2之前,P2也需要在P1之前执行。以此类推,需要一种修正的队列,这就是所谓的优先队列。

优先队列可以用两种链表的变种实现。一种变种是所有的元素按照进入顺序排序,出队时按照优先级。另一种是根据元素的优先级决定新增元素的位置。在这两种情况下,总的执行时间都是O(n),在标准库中使用后一种方式实现的,因为我们希望在元素出队时可以尽可能的快。

  • 双端队列

顾名思义,双端队列就是可以在队列的两端压入、弹出元素。这就有问题了,双端队列和普通的数组、链表有什么区别?不都可以两端访问嘛。当然是有区别的,双端队列的产生是基于以下需求的。众所周知,数组和链表是线性表的两种实现方式,数组的优势在于可以常数时间内随机访问元素,链表的优势在于可以常数时间内在两端插入数据。那么,有没有一种实现方式可以综合这两个特点呢?答案是双端队列。

一切的奥妙在于双端队列的实现方式。首先从数组讲起,我们定义了数组A,数组A本身是支持常数时间内随机访问元素的,但是如果在头部插入数据,就会造成大量元素后移,这是不能容忍的。怎么解决呢?那就再定义一个数组B,如果在A头部插入新元素a,就将a放到数组B的尾端,这时候数组A和数组B都是被封装在双端队列中的,并且双端队列维护了一段链式结构,其中每个节点指向一个数组。看到这里想必大家已经明白,双端队列通过维护多个数组来避免头部插入操作造成的大量数据后移,尽管双端队列的实现比较复杂,但是作为使用者,既可以常数时间内随机访问元素,又可以常数时间内在队列两端插入数据,这对于某些场景下非常合适。

双端队列并不能取代数组和链表,因为数组和链表的实现简单、直观,可以满足大部分需求,只有在特殊场景下才去考虑双端队列,这就是所谓的对症下药。

3、标准库实现

这里简单介绍下标准库中的栈和队列。

在标准库中栈和队列是一种容器适配器。什么叫做容器适配器呢?其实就是拿一种已有的容器,在上面重新封装对外暴漏的接口,拼装成一种新的特殊容器。

标准库首先实现了双端队列,它是一种真正的容器,不是容器适配器。

标准库中的栈是一种容器适配器,默认是基于双端队列实现的,我们在使用过程中可以指定新的底层容器,比如向量或者链表。

标准库中的队列也是一种容器适配器,默认也是基于双端队列实现的,但是我们只能选择链表作为新的底层容器,不能选择向量。这是因为队列是允许在头部删除数据的,而向量没有实现这种操作。

标准库中的优先队列也是一种容器适配器,默认是基于向量实现的,但是我们也能选择使用双端队列作为底层容器。注意,这里不能选择链表,因为标准库中的优先队列要求底层容器提供随机访问迭代器,而链表并没有提供。所谓的随机访问迭代器是指通过该迭代器可以访问容器中任一元素,而链表的迭代器只能自增或者自减,并不能随机访问任一元素。

到此为止,栈和队列的相关概念已经探讨完毕,本文也只是浅尝辄止,更加深入的知识需要在实践中摸索获取,毕竟,成就在于个人。

数据结构与算法-链表(下)

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
塔图姆:若再次被热火淘汰会考虑退役,希望在热火主场创造奇迹

塔图姆:若再次被热火淘汰会考虑退役,希望在热火主场创造奇迹

小豆豆赛事
2024-04-25 13:58:53
商务部贸易救济局负责人就欧盟突击检查中国企业在欧办公室答记者问

商务部贸易救济局负责人就欧盟突击检查中国企业在欧办公室答记者问

界面新闻
2024-04-24 20:24:51
凤凰传奇常州演唱会彻底杀疯了,现场沦为伴舞,副市长到场打call

凤凰传奇常州演唱会彻底杀疯了,现场沦为伴舞,副市长到场打call

娱乐白名单
2024-04-24 18:07:02
大批美军空降乌克兰,美方警告中方不准帮俄!普京紧急下达军令!

大批美军空降乌克兰,美方警告中方不准帮俄!普京紧急下达军令!

绝对军评
2024-04-25 11:19:59
胡歌上海街头拍摄被网友偶遇,笑起来好腼腆,41岁状态好棒!

胡歌上海街头拍摄被网友偶遇,笑起来好腼腆,41岁状态好棒!

娱乐的小灶
2024-04-25 17:04:50
关注民生的煤气一词,竟成为敏感词语,实在想不明白,怎么会这样

关注民生的煤气一词,竟成为敏感词语,实在想不明白,怎么会这样

天闻地知
2024-04-24 14:06:59
善恶终有报,“销声匿迹”的宋祖英,已经走上了另一条康庄大道

善恶终有报,“销声匿迹”的宋祖英,已经走上了另一条康庄大道

简读视觉
2024-04-21 13:22:17
因利空一字跌停演绎地天板走势,又因利空一字涨停让人看不懂!

因利空一字跌停演绎地天板走势,又因利空一字涨停让人看不懂!

资本百科
2024-04-25 13:07:50
比亚迪再发“全球颠覆性”创新技术

比亚迪再发“全球颠覆性”创新技术

电动知家
2024-04-23 15:10:24
善恶终有报!“港独分子”陈方安生,现在已活成了一个“笑话”?

善恶终有报!“港独分子”陈方安生,现在已活成了一个“笑话”?

韶华倾覆i
2024-04-24 11:51:55
金锁被官兵欺负,只剩一件“肚兜”的时候,你还记得尔康说了啥么

金锁被官兵欺负,只剩一件“肚兜”的时候,你还记得尔康说了啥么

娱乐的小灶
2024-04-25 00:23:04
东北夫妻吃南方烧烤,刷新了对烧烤的印象:100串都感觉吃不饱

东北夫妻吃南方烧烤,刷新了对烧烤的印象:100串都感觉吃不饱

大苏专栏
2024-04-22 21:24:24
克罗斯:安帅最近骗人,本来说赢马洛卡就稳了现在还得赢皇社

克罗斯:安帅最近骗人,本来说赢马洛卡就稳了现在还得赢皇社

直播吧
2024-04-25 10:46:19
新华社快讯:马来西亚前总理马哈蒂尔正在接受反贪污委员会调查。

新华社快讯:马来西亚前总理马哈蒂尔正在接受反贪污委员会调查。

新华社
2024-04-25 16:52:13
上海严禁对已出示本人有效身份证件的旅客进行“强制刷脸”核验|中国交通新闻

上海严禁对已出示本人有效身份证件的旅客进行“强制刷脸”核验|中国交通新闻

蛙斯基娱乐中
2024-04-25 12:31:55
25张难得一见的精彩照片,你没见过的世界,看后眼界都提高了

25张难得一见的精彩照片,你没见过的世界,看后眼界都提高了

农人老寓
2024-04-23 19:55:20
中老年女人:为什么劝你少披头散发、多扎头发?看3组对比图就懂

中老年女人:为什么劝你少披头散发、多扎头发?看3组对比图就懂

潮人志Fashion
2024-04-24 08:31:13
新股发行价9.6元,市盈率41.44倍,夫妻控股,中金保荐,会破发吗

新股发行价9.6元,市盈率41.44倍,夫妻控股,中金保荐,会破发吗

老道闲聊
2024-04-25 08:13:03
葛斯齐再爆猛料!大S孩子学校家长集体怒揭大s真面目:经常爆粗口

葛斯齐再爆猛料!大S孩子学校家长集体怒揭大s真面目:经常爆粗口

小娱乐悠悠
2024-04-25 10:05:17
特斯拉在国内取消所有应届毕业生offer

特斯拉在国内取消所有应届毕业生offer

南方都市报
2024-04-24 17:32:11
2024-04-25 19:54:44
软件开发快速学习
软件开发快速学习
学习软件开发必备技能
4文章数 6关注度
往期回顾 全部

科技要闻

北京车展,被穿红衣服的他们占领

头条要闻

美学者:布林肯一年内二次访华 说明美国面临很多困难

头条要闻

美学者:布林肯一年内二次访华 说明美国面临很多困难

体育要闻

当胜利变成意外,就不要再提未来……

娱乐要闻

心疼!伊能静曝儿子曾被狗仔追到洗手间

财经要闻

曙光已现?瑞银开始转而看好中国地产业

汽车要闻

全新哈弗H9亮相 大号方盒子硬派SUV入列

态度原创

艺术
亲子
健康
手机
公开课

艺术要闻

艺术名画︱爱尔兰画家大卫·科因的刀画作品

亲子要闻

长白这家儿童乐园真的是太好了

这2种水果可降低高血压死亡风险

手机要闻

外媒预计苹果iOS 18正式版9月中下旬发布 AI是一大看点

公开课

睡前进食会让你发胖吗?

无障碍浏览 进入关怀版