剑指offer_栈和队列---栈的压入,弹出序列

来源:互联网 发布:淘宝怎样用花呗付款 编辑:程序博客网 时间:2024/06/07 01:54

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

解题思路

1,按照顺序持续入栈,直到发现和出栈第一个元素相同的为止,弹出,接着判断
2,这时候就有两种情况,第一种就是//1,2,3,4,5和3,2,1,4,5这种情况弹完3,弹之前的 ,然后之后的入栈再弹。第二种情况是 //1,2,3,4,5和3,4,5,1,2这种情况,弹完3,入栈之后的,弹出,再弹之前的。总结起来就是逐个比较即可,当前没有接着入栈,如果到最后栈还没弹完,说明该弹出序列不是该压入序列的正确弹出。

代码实现

/** *  */package 栈和队列;import java.util.Stack;/** * <p> * Title:IsPopOrder * </p> * <p> * Description: * </p> *  * @author 田茂林 * @data 2017年8月22日 上午11:03:06 */public class IsPopOrder {    Stack<Integer> stack = new Stack<Integer>();    public boolean isPopOrder(int[] pushA, int[] popA) {        if (pushA == null || popA == null || pushA.length < 1                || popA.length < 1) {            return false;// 非空判断        }        int index = 0;        for (int i = 0; i < pushA.length; i++) {            stack.push(pushA[i]);               //1,2,3,4,5和3,4,5,1,2这种情况            while(!stack.isEmpty()&& stack.peek() == popA[index]) {    //1,2,3,4,5和3,2,1,4,5这种情况                stack.pop();                index++;            }        }        return stack.isEmpty();   //如果全部正常弹出,则为真,按照该序列,栈并没有弹出到空为止则不是    }}
原创粉丝点击