全是套路——出栈顺序

实习终于结束了,好久没有总结编程问题了,因为最近真是没怎么写程序。

今天做华为的火车进站问题,这是一道看似像全排列,其实是栈的问题。

看了一些网上的写法,掌握了一种思路,也是种投机取巧的方法:

先产生序列的全排列,然后再全排列里面去除不可能的出栈顺序。

1.全排列很好产生,用stl里面的next_permutation(begin,end)

2.判断这个排列是不是正确的出栈顺序。

就第2点:

1.给一种进栈顺序加上序号,比如4,2,8这么进栈,则4为0,2为1,8为2,以此类推。只是想表明一个顺序,4在前面进栈,然后是2最后是8

2.抓住出栈的规则,比如入栈序列:1 2 3 4 5 6,出栈序列,4,3,5,2,6,1。

4先出栈,则4前面的321肯定在栈内,必然是按顺序出栈的(中间可能夹杂其他元素)。3出栈,前面的21肯定也是这样。

所以可以总结一句话:

出栈的每一个元素之后的所有下标比它小的元素,这些元素的下标一定是有序的!

下标:之前所说的序号。就是入栈顺序。

举例来看,4,3,5,2,6,1。4之后的3 2 1有序,3后面的2 1有序,5 后面的 2 1有序,2后面的1有序,6后面的1有序。

所以,这样就简单了。代码就不上了,这是个投机取巧的方法,今天太困了,脑子转不过来,递归写不了。

 
原文地址:https://www.cnblogs.com/wyc199288/p/5791326.html