栈的定义
栈(stack): 是定义仅在表尾进行插入和删除操作的线性表
栈的特性:
(1)把允许插入的一端称为栈顶(top),对应的另一端称为栈底(bottom)
. (2)如果栈里面不含任何元素那么我们称之为空栈
(3)栈是又称为一种先进后出(Last In First Out)的线性表,简称LIFO结构
注意:
栈是一种特殊的线性表,(栈的元素具有线性关系,既前驱和后继关系。定义中讲到栈的插入和删除表尾进行插入和删除查找,这里的表尾是指栈顶,而不是栈底)
栈的特殊之处在于给线性表加了一些规矩既:栈这种线性表的插入和删除只能在栈顶进行,而不是栈底
对栈的操作
栈的插入叫:进栈也叫压栈或者入栈
栈的删除叫:出栈或者弹出栈
进栈出栈变化形式
了解了上面讲的知识后我问以下你,是不是最相进去的元素一定是最后出来。可能你会说难道不是吗?不一定,不信?成我带你去瞧瞧。
虽然栈对线性表的插入和删除上做了限制但并没对出栈的时间做出限制,那么也就是说第一个进栈的元素不一定要等到最后才能出栈,只要符合栈顶元素出栈就OK。既然如此那么就会出现下面的情况:
假设有1、2、3要依次进栈,那会产生那些出栈的顺序
第一种:1进 2进 3 进 3出 2 出 1出 出栈结果:3、2、1
第二种:1进 1出 2进 2出 3进 3出 出栈结果:1、2、3
第三种:1进 2进 2出 1出 3进 3出 出栈结果:2、1、3
第四种:1进 1出 2进 3进 3出 2出 出栈结果:1、3、2
第五种:1进 2进 2出 3进 3出 1出 出栈结果:2、3、1
注意:312这种出栈顺序是没有的,因为3要先出栈就意味着3曾经进过栈,那么就意味着1 2 已经进栈了,此时的2一定在1上面。那么2肯定比1要先出栈,那么就不可能有312这种出栈顺序,除非对进栈次序做改动。
看到了吧,光三种元素就有5种出栈的次序,那么如果元素更多,那么出栈的变化会更多。这也就这个特点一定要明白!!!
栈的作用
栈的引入简化了程序设计问题,划分了不同关注层次,使得思考的范围缩小·,更·聚焦于我们要解决问题的核心,反之像数组等,因为要分散精力去考虑数组下标增减等细节问题反而遮盖了问题的本质。
限制的高级语言如:java 、 C#等等都对栈结构做了封装,你可以不用关注它的实现细节,直接使用Stack的push和pop方法,大大减少了使用难道,非常的方便。
如果还相进行深入了解栈这种数据结构我推荐 :《大话数据结构》是2011年清华大学出版社出版的图书,作者是程杰。本文就是对书中所说的栈进行了总结。