我们都知道栈是先进后出的,最近总遇见这样的题型,原则是“先进后出”,但做题总漏掉
现以四个为例:设链栈的输入序列为A B C D,试写出所得到的所有可能的输出序列。
解:从A先出栈开始考虑所有情况,然后在A出的接触上接着考虑B出的情况,直到最后;然后考虑B先出的情况,在B先出的基础上剩余的按小到大的顺序考虑。
(一)A先出
(1)A先出基础上B出有:ABCD、ABDC
(2)A先出基础上C出有:ACBD、ACDB、ADCB
(3)A先出基础上D出有:ADCB
同理有B先出:BACD、BADC、BCAD、BCDA、BDCA
有C先出:CBAD、CBDA、CDBA
有D先出:DCBA
检查正误的规律:先出来的序号后面一定不能有比他本身小的从小到大排列的序列。
例:在此题中ADBC不是解 ,如图:
同样的:
BDAC不是解,因为AC都小于D,且AC是从小到大排列;
CABD不是解,因为AB都小于C,且AB是从小到大排列;
CADB不是解,因为AB都小于C,且AB是从小到大排列,(尽管他们中间隔着D;)
CDAB不是解,因为AB都小于C,且AB是从小到大排列;
DABC不是解,因为ABC都小于D,且ABC从小到大排列;
DACB不是解,因为ACB都小于D,且AB从小到大排列;
DBAC不是解,因为BAC都小于D,且AC从小到大排列;
DBCA不是解,因为BCA都小于D,且BC从小到大排列;
DCAB不是解,因为CAB都小于D,且AB从小到大排列。