快速判断一个数列是否是合法的出栈顺序

背景

做笔试题目的时候,发现有一些试卷有给定一个进栈序列让你判断下列哪个是合法/不合法的出栈序列。
通常进栈的序列不是升序如{1,2,3,4,5,6}就是{6,5,4,3,2,1},当然其他的我好像就没有看到了,如果遇到了其他的情况会及时更新在这篇博客中的。

快速判断方法

第一个问题

Problem 1:有六个元素{6,5,4,3,2,1},按照该顺序入栈,那么以下哪一个是不合法的出栈顺序().
A) 543612
B) 453126
C) 346521
D) 234156

发现入栈的顺序是降序排列,由于栈是FILO,所以快速判断的依据就是任意数A的后面比A大的数都是按照升序排列的

  • A中5后面比5大的是6,升序;4后面比4大的是6,升序;3后面比3大的是6,升序;以此类推,所以A合法。
  • B中4后面比4大的是5和6,是升序的;以此类推,B合法。
  • C中3后面比3大的是4,5和6,然而可以发现465并不是升序排列,所以这个不合法。
  • D中同理,2后面的3456是升序,其他的也可以验证,所以也是合法的。

第二个问题

Problem 2:有六个元素{1,2,3,4,5,6},按照该顺序入栈,那么543216和542136哪个是合法的出栈序列?

发现入栈顺序是升序排列,同样由于FILO,所以快速判断的依据就是任意数A后面比A小的数都是按照降序排列的

  • 543216中,5后面比5小的有4321,在543216中的确是按照降序的,其他的位也能以此判断,所以543216是合法的;
  • 542136中,4后面比5小的有4321,但是4213这个并不是降序排列,所以是不合法的。

总结

  1. 栈的FILO特性的理解
  2. 从入栈顺序的特点出发,结合FILO判断出栈的顺序
  3. 死记硬背不可取,多理解
  4. 这只是快速做选择题和判断题,代码题可能需要思考一下应该用什么数据结构和算法来实现了

你可能感兴趣的:(数据结构与算法,Java菜鸟之路,算法,数据结构,java)