栈是什么?听别人讲很多例子,但却只是理解浅浅的一层。
栈不是什么计算机存数据的物理方式,实际为——许多真真切切的问题
1.定义
栈是限定仅在表尾进行插入和删除操作的线性表
看过我之前关于线性表理解的文章就很容易理解这个定义,栈——面向问题的一种逻辑结构。
比如说子弹匣装填子弹就是一个实际问题,栈其实就是描述子弹装上去、卸下来这个过程的逻辑,和计算机无关,线性表亦是如此。
那么为什么既然说栈是线性表,要单独拿出来说呢?
——问题与问题之间关注的东西是不同,线性表关注的是一个个排好队的元素和它们的各种变化,而栈关注的也是这些排好队的元素,但是栈只关注一种情况:只在表尾增删。就像子弹装填问题一样,我们不需要关注从中间拿出一颗子弹需要怎么做,怎么查找到印有图案那一颗子弹,我们只关注子弹排列末尾的弹出和插入。因此!栈单独拿出来描述范围更小更精确问题,更加有效率。
2.应用
既然是面向问题的逻辑结构,当然最重要的还是实际问题的应用。
- 在我看来,由于栈比线性表更有逻辑性,它和队列都是解决数据元素顺序问题的,但是(重点)栈适用于变化较多的元素排列问题上,就像它能处理中缀表达式转换后缀表达式并且计算(可先自行百度)的这些问题,适用于队列的问题很容易分辨,但是适合栈的呢?我认为,例如遇到一个列元素的顺序排列问题,优先考虑用栈的方法去看是否能实现
- 另外一个栈的应用就是递归思想了,通俗理解就是当时间回退,退回的必然是刚过去的那一秒。而递归就是在自己家里面再搭建一个小家,想回到走出真正的家门就必须先走出小家的门口。栈在这里做的就是回退的这一功能,记住这两个字应该就能理解栈在递归中的应用了。
其他
另外共享栈这个概念,我之前有疑问,既然栈能够共享,为什么线性表就不能呢?我思考的结果是,线性表描述问题的方式使得不可以把顺序存储的线性表共享,因为——里面有一个length是描述线性表长度的,而描述栈的是一个指针,虽然作用基本相同,但是!它们代表的含义不同!如果强行概念偷换会让描述线性表的属性失去本来的意义。
网友评论