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)

玻璃钢生产厂家如何抓好商场美陈铁岭批销沈阳玻璃钢花盆鄂州玻璃钢雕塑厂家玻璃钢雕塑有什么缺点玻璃钢泡沫雕塑收费大熊猫商场美陈上海优质玻璃钢雕塑价格合理开原玻璃钢长颈雕塑玻璃钢雕塑浪花图片大全辽宁玻璃钢卡通草莓雕塑黑龙江扁鹊人物玻璃钢雕塑制作上海室内商场美陈市场云浮玻璃钢造型雕塑淄博玻璃钢雕塑生产商河南公园水景玻璃钢仿铜雕塑厂家海口设计玻璃钢雕塑哪家好陕西玻璃钢仿铜雕塑玻璃钢军人雕塑玻璃钢雕塑强度问题水性玻璃钢花盆透气吗绵阳玻璃钢商场美陈开县玻璃钢卡通座椅雕塑威海形象玻璃钢雕塑铸铜玻璃钢人物雕塑公司崇川区玻璃钢艺术雕塑商场新年美陈灯笼马鞍山玻璃钢雕塑厂电话商场美陈还是商业美陈贵州环保玻璃钢雕塑多少钱济南玻璃钢西瓜雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化