package com.hackhu; import java.util.Stack; public class Question22 { /** * 问题:给定数组为压栈顺序(无重复),判断另一数组是否可能为出栈顺序 * 思路:建立一个辅助栈,依序遍历压栈序列,若与出栈数不相等,则将该压栈数压入辅助栈,继续遍历压栈数组 * 若相等则继续遍历入栈序列和出栈序列,当出栈序列与入栈序列和辅助栈序列都不一致时,返回 false * 若辅助栈空,且入栈序列遍历完毕则返回 true * @param pushOrder * @param popOrder * @return */ public boolean isPopOrder(int[] pushOrder,int[] popOrder){ // 出栈、入栈序列为空或长度不相等,则返回 false if (pushOrder == null || popOrder == null||pushOrder.length!=popOrder.length) { return false; } Stack<Integer> stack = new Stack<>(); int pushIndex = 0, popIndex = 0, len=pushOrder.length; while (popIndex < len) { if (pushIndex<len&&pushOrder[pushIndex] == popOrder[popIndex]) { // 入栈出栈序列一致,继续遍历下一个 popIndex++; pushIndex++; } // 辅助栈顺序与出栈序列一致,辅助栈出栈,继续遍历下一个 else if (stack.size() != 0 && stack.peek() == popOrder[popIndex]) { popIndex++; stack.pop(); } // 入栈序列遍历结束且辅助栈顺序与出栈序列不一致,直接返回 false else if (pushIndex >= len && stack.peek() != popOrder[popIndex]) { return false; } // 压入辅助装,继续寻找下一相同序列 else { stack.push(pushOrder[pushIndex]); pushIndex++; } } return stack.size()==0&&pushIndex==len; // 当序列一致时,辅助栈为空,入栈序列遍历完成 } public static void main(String[] args) { int[] push = {1, 2, 3, 4, 5}; int[] pop = {4, 3, 5, 1, 2}; Question22 question22 = new Question22(); System.out.println(question22.isPopOrder(push,pop)); } }