前言

本博文部分图片, 思路来自于剑指offer 或者编程珠玑

问题描述

13 给定的出栈序列是否满足入栈序列_算法

思路

对于这个问题, 书中给出了一种解法

思路 : 依照给定的序列模拟进行压栈, 出栈操作, 判断是否能够形成给定的出栈序列, 详细思路请见 “剑指offer”, 或者下面的代码的注释

参考代码

/**
 * file name : Test06StackPushPopOrder.java
 * created at : 2:15:32 PM Jun 7, 2015
 * created by 
 */

package com.hx.test05;

public class Test06StackPushPopOrder {

    // 给定一个入栈顺序  判定是否能形成制定的出栈序列
    public static void main(String []args) {

        int[] pushSeq = new int[] {1, 2, 3, 4, 5 };
//      int[] popSeq = new int[] {1, 2, 3, 4, 5 };
        int[] popSeq = new int[] {1, 3, 2, 5, 4 };
//      int[] popSeq = new int[] {5, 4, 3, 2, 1 };

        isStatisfiyPushPopOrder(pushSeq, popSeq);

    }

    // 思路 : 先判断Stack顶部的元素是否是下一个popSeq中的元素[top]   如果是, 则直接从stack中pop该元素
        // 否则  将pushSeq中的元素 压入Stack中, 直到新的栈顶元素为top 或者push了pushSeq中所有的元素
            // 现在 判定Stack的顶部元素是否是top   如果是, pop顶部元素, 进入下一个循环, 判定下一个popSeq的元素
            // 否则 则说明添加了所有的pushSeq中的元素 也没有找到一个和top相同的元素    表示不可能形成此输出序列  返回false
    public static void isStatisfiyPushPopOrder(int[] pushSeq, int[] popSeq) {
        Deque<Integer> stack = new LinkedList<Integer>();
        boolean isLeagel = true;

        int pushIdx = 0, popIdx = 0;        
        while(popIdx < popSeq.length) {
            int top = popSeq[popIdx ++];
            if((stack.size() > 0) && (top == stack.getFirst()) ) {
                stack.pop();
            } else {
                for(; pushIdx < pushSeq.length; pushIdx ++) {
                    stack.push(pushSeq[pushIdx]);
                    if(pushSeq[pushIdx] == top) {
                        break;
                    }
                }

                if(top == stack.getFirst()) {
                    stack.pop();
                } else {
//                  Log.log(false);
                    isLeagel = false;
                    break ;
                }

            }
        }

        Log.log(isLeagel);
    }

}

效果截图

13 给定的出栈序列是否满足入栈序列_栈_02

总结

思路应该是不难, 时间复杂度为线性时间复杂度

注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!