Skip to content

# 栈和队列 - 概念与实现

# 栈

# 栈的概念

栈只能在一端添加或者删除。很容易想象得到,如果你要拿到最下面的元素, 就必须把上面的元素都拿掉才行。 现实中我们很容易找出这样的例子。无论是叠放的碗或者盘子,还是放入行李箱的衣物。 最先放进去的都会被压到最下面。当你拿出来的时候,最先放进去的一定回到最后才能被拿出来。

我们把这种情况称为:后进先出(LIFO,Last In First Out),或者先进后出(FILO,First In Last Out)。

后进先出是栈的特点。

# 栈的操作

对于栈,只有两个非常简单的操作,即入栈和出栈。数据结构上我们一般用push(压栈)和pop(弹出)这两个术语。再加上很明显需要的初始化和销毁操作,一共有四个操作是我们需要的。在加上我们可能会需要用到的emptyfull,用来判断栈是否为空,或者是否满,完整的操作如下:

我们增加了一个top函数,用来获取栈顶的元素,也就是说把pop这个函数分成两步来做。 这么做有两个原因:

  1. 有时候你确实需要只看不拿,例如如果你对Windows消息队列(虽然他是队列,但也同理)比较清楚的话,你应该知道有一个Peek函数,就是用来“偷窥”一下,但不进行操作。
  2. 更为重要的一点是出于对函数功能单一化的要求,即一个函数只做一件事。

# 栈的顺序实现

线性表有两种实现方式:连续的顺序表和不连续的链表,对应到栈,当然也可以有两种(事实上不止)不同的实现方式,即顺序实现方式和链式实现方式。我们先看顺序实现方式。

显然我们用一个数组(顺序表)来存放元素,并且元素与元素之间连续存放。

我们将0号元素固定作为栈底,通过调整栈顶指针来实现栈元素的压栈和弹出:

要注意,我们将栈顶指针放在已有元素的下一位,即下一个空格处。这是为了避免栈空时,栈顶指针为负数,与多数人的直觉不符。

由此我们可以很容易写出对应的代码:

这里我们用capacity表示预留的尺寸,top表示栈顶指针,这里简单用下标来表示,base指向预留的内存空间。由于栈底在整个过程中是不会变动的,所以不需要记录栈底,或者说栈底就是base

请注意这里压栈和出栈的下标如何变动,自己在纸上画一下,就很容易理解操作的次序、如何判空和如何判满。

你可能还会需要emptyfull这两个函数用来判定栈是否为空,或者是否已满,请自行编写。

我们可以通过代码来验证一下栈的LIFO性质:

你会得到

出栈的顺序与进栈的顺序正好相反。

很显然,顺序表示的栈所有操作复杂度都是O(1) O(1)

聚圣源涵字在起名的寓意2018宝宝怎么起名男性起名属土的字画江湖之不良人2烁字起名有什么含义三藏免费起名网取名银河护卫队百度云天堂2服务端给合作社起个人名建党日悲喜交集叶辰萧初然免费芭贝乐冰淇淋烟酒店起名虐杀原形1孩子起名生辰八字原则冬天的成语昆明大师起名烘焙食谱忍者之刃中文版猎人宝宝技能自信的事例笔记本主流配置龙潭湖公园猪胎儿宜用字起名张姓起名数理凡人修真传公司八字起什么名字好给摄影工作室起名刚出生的男生起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化