动态图解算法面试题之栈的压入、弹出顺序

中间有动态图展示过程。

动态图解算法面试题之栈的压入、弹出顺序_第1张图片

 

01 题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,第二个表示栈的弹出顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

例如:序列1,2,3,4,5是栈的压入顺序,4,5,3,2,1是该栈的弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 

02 解释

1.入栈顺序 1,2,3,4,5。

出栈顺序,4,5,3,2,1

解题过程,我们需要用一个辅助栈,按照出栈顺序把入栈数值压入弹出一遍,对比弹出顺序是否与出栈相等

(1)出栈元素4,那么4之前所有的入栈元素1,2,3,4都已经入辅助栈。(1,2,3不先入栈,4怎么入栈,也没法出栈了),辅助栈结果,1,2,3,4。对比辅助栈4和出栈元素4相等弹出。

入栈顺序 1,2,3,4,5。

出栈顺序4,5,3,2,1

辅助栈元素,1,2,3,弹出栈顶元素4

(2)出栈元素5,辅助栈中栈顶元素不是5,所以从入栈序列中把5之前的元素都入栈,直到遇到5

入栈顺序 1,2,3,45

出栈顺序 45,3,2,1

辅助栈,1,2,3,5,弹出对应栈顶元素5

(3)出栈顺序3 与辅助栈顶元素3,对比相等,弹出栈顶元素3.

入栈顺序 1,2,3,45

出栈顺序 453,2,1

辅助栈1,2,弹出栈顶元素3

(4)出栈顺序2与辅助栈顶元素2,对比相等,弹出栈顶元素2.

入栈顺序 1,2,3,45

出栈顺序 4532,1

辅助栈 1,2,弹出栈顶元素2

(5)出栈顺序1与辅助栈顶元素1,对比相等,弹出栈顶元素1,

入栈顺序 1,2,3,45

出栈顺序 45321

辅助栈空1。弹出栈顶元素1。

此时出栈顺序,入栈顺序都已经遍历完成,栈为空,返回。

动图如下

动态图解算法面试题之栈的压入、弹出顺序_第2张图片

左边辅助栈与右边出栈顺序对比

2.入栈顺序 1,2,3,4,5。

出栈顺序,4,3,5,1,2

辅助栈

(1)出栈顺序4,辅助栈元素 1,2,3,4。辅助栈顶元素4与出栈顺序4相等弹出。

入栈顺序 1,2,3,4,5。

出栈顺序,4,3,5,1,2

辅助栈 1,2,3,4

(2)出栈顺序3,辅助栈元素1,2,3 栈顶元素3与出栈顺序3相等弹出。

入栈顺序 1,2,3,4,5。

出栈顺序,43,5,1,2

辅助栈 1,2,3

(3)出栈顺序5,辅助栈顶元素2与5不相等,在入栈

入栈顺序 1,2,3,45

出栈顺序,435,1,2

辅助栈 1,2,5

(4)出栈顺序1,辅助栈顶元素2与出栈顺序1对比不相等,但是入栈元素都已经入栈。弹出顺序没法相等。结束,返回false

入栈顺序 1,2,3,45

出栈顺序,435,1,2

辅助栈 1,2

03 java代码实现和总结

总结:借用辅助栈,压栈入栈元素,弹出顺序对比与出栈顺序是否相等。

结束条件:1.入栈元素遍历完,出栈顺序遍历完,辅助栈为空。返回true。

2.入栈元素遍历完,出栈顺序对比辅助栈中元素不相等,退出。返回false

 public static boolean stackPushPopOrder(int [] pushOrder, int [] popOrder) {
    if (pushOrder == null || popOrder == null
        || pushOrder.length == 0 || popOrder.length == 0
        || pushOrder.length != popOrder.length) {
      return false;
    }
    Stack assistStack = new Stack<>();
    int i = 0, j = 0;
    while (j < popOrder.length) {
      while ((assistStack.isEmpty() || assistStack.peek() != popOrder[j])) {
        if (i >= pushOrder.length) {
          break;
        }
        assistStack.push(pushOrder[i ++]);
      }
      if (assistStack.peek() != popOrder[j]) {
        break;
      }
      assistStack.pop();
      j ++;
    }

    return assistStack.isEmpty() && i == pushOrder.length;
  }

 

你可能感兴趣的:(算法和数据结构)