使用js解决栈的压入与弹出序列问题
学习算法与数据结构已经有一段时间了,对于算法也算是有一点的了解。在自己使用js去实现算法的过程中,也遇到了不小的问题,在这里就分享一下自己使用js来解决栈的压入与弹出序列问题的解决方式。首先引入问题描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)。下面是这个函数实现中传入的两个参数。
对于这个函数的封装,在最开始的时候还是有点懵逼的。最后参考了一些解题的思路,然后就有了一个自己解决这道题的思路。在这个题中首先需要我们去明白的就是怎样根据压入序列去判断第二个序列是否为该栈的弹出序列这就话。在这里就拿题给的实例来举例说明,题中所给栈的压入顺序是1,2,3,4,5 弹出序列是4,5,3,2,1 那么在实现的过程中我们可以这样想,将压入序列重新入栈,如果压入序列的值与弹出序列中的第一个值相等就将压入栈中的值出栈,并且还需要将弹出序列中的第一个值在弹出序列的数组中删除,那么经历过这个过程后,在栈中的元素就为1,2,3在弹出序列这个数组中的元素就是3,2,1。那么接下来第二步就是最重要的了,在这里我们就可以写一个flag作为标志,在栈中的元素依次出栈并且与此时的弹出序列依次比较,如果有任何依次比对不成功就将flag设置为0并且跳出这个循环。然后如果flag为0表示此弹出序列就不是此压入序列中的一个。
说完这个后,还有一个比较恼火的问题,就是在js中如何去封装一个栈与栈中的方法。在java中有现成的栈的方法与构建栈的方式,其方法有pop() push() peek() empty() siez()等,因此在这里先介绍一下在js中怎样去构建一个栈与其实现的方法。这样的实现方式采用了js中闭包的思想,其代码与方法的含义如下所示:
当这些前期工作都做完之后就可以使用代码来实现了,代码与每一步的注释如下: