栈的本质

 

 用一题来作为引例吧。重点不是怎么解,是要思考是怎么想到用栈来解决这个问题的。

首先拿到这个问题怎么思考呢?记住,先将难的问题分解成简单的问题来思考。那么这题要怎么简化呢?我能不能把这题只简化成一种括号呢?后面让我们看看这些括号来分析什么样的括号是合法的:

 

 从这些例子中我们要分析出几个问题:

1,在第二个例子中,右括号的数量比左括号数量多了。

2,到了最后一个括号的时候发现左括号和右括号数量不会相等。

所以我们得到了一些性质:

 

分析到这个地步发现根本不用栈啊,只要统计左括号的数量和右括号的数量就好了啊

 

 但是思考一下,这个右边的变量是需要的吗?其实不需要啊,只要记录左括号剩余的数量就好了,然后遇到一个右括号就抵消掉一个左括号就好了。遇到左括号就++,左括号就--。

 

 

 

所以再回到栈,入栈操作不就是栈顶指针加一,出栈操作不就是栈顶指针减1,这个不就和栈对应起来了吗?所以,左括号是代表入栈,右括号是代表出栈。所以一对括号代表什么?来看下面的思考

 

 所以把每一个括号理解成一个事件,遇到左括号不就是一个事件发生了,遇到右括号的话不就是一个事件解决了。

 如果是括号之间有所谓的包含关系的话,那么我可以把外层的括号理解成大事件,一个大事件中包含了很多的小时间,事件解决的顺序不就是大事件最先发生然后最后解决。这个不就是栈的特性,先进后出??

 

 最终我们推出了这个数据结构,那就是栈,可以用来处理具有完全包含关系的问题。这个地方就想到了函数执行的栈。函数执行的时候不也是先从主函数开始执行吗。然后我们想到递归函数的设计。

递归程序不是也要用到栈吗?我们递归程序首先要给我们函数一个明确的语义,然后设计边界条件,然后设计递归过程,最后返回值。而且递归是一直往规模小的地方递归。

 

 这个括号的集合可以转化为1个树形结构,父节点不就是大问题,叶节点就是小问题。那对于树形结构我们是怎么定义的?是递归!现在不就是全部串一起了。树形结构本身就是具有完全包含关系的一类问题。

ok!现在来重新看开头的题目,括号之间怎么是合法的?无非就是括号之间是完全包含关系。碰到左括号入栈,碰到右括号出栈。吧出栈的元素与前一个看看会不会匹配就好了,如果可以一直到栈底的话就是匹配的返回TRUE。

 

posted @ 2022-03-02 09:52  prize  阅读(78)  评论(0编辑  收藏  举报