栈原理
栈:栈是限制在插入和删除只能在一个位置上的线性表。
栈有很多概念,基本上就是对特定的位置处理的时候一些特殊的叫法,一点都不神奇。比如,出栈,弹栈,压栈,入栈,栈顶,栈底这类的术语。
任何一个事物都有动作和形态,栈作为一种抽象的事物,同样,也能通过这种方式描述,在描述的过程中产生的一系列表达式就是他们的术语。
认识栈是什么
栈可以简单的理解为是一个杯子,就一个杯子口,杯子只有俩状态,要么是东西进入的状态,要么是东西离开的状态。依次放入的东西,拿出来的时候,总是最后一个先被拿出来。这样描述基本上就把栈的所有内容形容完毕了。
认知归纳
那么我们可以归纳如下内容:
- 杯子可以理解为一个栈空间,是有容量的。这在说明栈是有大小的,不是无限的。
- 杯子的杯子口就是东西进入和东西离开的地方,这个地方是在杯子顶部,所以可以说成是杯子顶部,那么应用到在栈里面,专业术语就可以叫做栈顶部,简称栈顶。
- 相对应的,在杯子的最底部的那一层,自然而然地就叫做杯子底部,那么应用到栈里面,专业术语就可以叫做栈底部,简称栈底。
- 还能得到一个结论是杯子顶部才能进入和离开,然而杯子底部不能进入和离开。把杯子看作栈,可以应用到栈里面就是,栈顶可以进入和离开,栈底不可以进入和离开。同义词替换为专业术语就是栈顶可以添加和删除,栈底不可以添加和删除。
- 栈的添加有一个更为专业的叫法,叫做入栈,专业一点的叫法是压栈。
- 栈的删除也有一个专业的叫法,叫做出栈,专业一点的叫法是弹栈。
归纳名词提炼
提炼结论的专业名词解释:
- 栈大小:最大能够存多少数据。
- 栈顶:允许插入和删除的一端位于表的末端,叫做栈顶。
- 栈底:不允许插入和删除的另一端叫做栈底。
- 压栈:通过在表末端,向栈顶插入一个元素,就叫做压栈,英文名PUSH。
- 弹栈:通过在表末端,从栈顶删除一个元素,就叫做弹栈,英文名POP。
归纳动作结论
首先放入杯子里面的东西,肯定都是最后才可以拿出来。最后放入杯子的,肯定是第一个就可以拿出来。对于这种现象,在栈里面有一个专业术语叫做,先进入的后出来,后进入的先出来。开玩笑,这听着都不专业。专业术语得有逼格,前面的话,可以用四个字形容,就叫做后进先出
.
后进先出(先进后出)
这俩是一个意思,栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素。
图片形式认识栈:
在图片介绍里面,可以看到栈顶压栈和弹栈均在栈顶,同时也可以看到栈是有容量的。
再者能看到一个top索引,主要是为了指示当前栈拥有的最后一个值的位置。主要为了访问栈。
认识压栈动作
认识弹栈动作
栈实现
由于栈是一个表,因此任何实现表的方法都可以用来实现栈。主要有两种方式,链表实现和数组实现。
实现栈,或者说实现一个完整的数据结构,至少要有增删改查,创建,销毁。 对于栈,为了便于理解只需要实现增删差即可,其他都很容易。
链表实现栈
可以使用单链表来实现栈。通过在表顶端插入一个元素来实现 PUSH,通过删除表顶端元素来实现 POP。使用链表方式实现的栈又叫动态栈。动态栈有链表的部分特性,即元素与元素之间在物理存储上可以不连续,但是功能有些受限制,动态栈只能在栈顶处进行插入和删除操作,不能在栈尾或栈中间进行插入和删除操作
参考:
推荐先认识栈后,再去想实现
数组实现栈
栈也可以用数组来实现。使用数组方式实现的栈叫静态栈。
参考: