算法复习:栈的压入、弹出序列

来源:互联网 发布:ghost32软件详解 编辑:程序博客网 时间:2024/06/17 18:05

题目描述

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

解题思路:

首先看弹出栈的第一个数字是4,所以栈里面必须有1,2,3,4了,因为题目已经告知是按照1,2,3,4,5的顺序压入栈。把4弹出之后弹出栈是5,站内剩下1,2,3,栈顶不是5,所以需要在弹入栈中按顺序弹入数字,直到是5。再弹出5之后是3,与栈顶元素相同,依次弹出。

写代码思路:

首先构造一个栈,再遍历弹出栈,假如要弹出数字是栈顶数字,直接弹出,假如不是或者栈为空,则依次压入弹入栈数字。最后都弹出了,栈为空则符合

Java代码如下:

public boolean IsPopOrder(int[] pushA, int[] popA) {    boolean bPopOrder = false;    if (pushA != null && popA != null) {        int popIndex = 0;        Stack<Integer> stack = new Stack<Integer>();        for (int i = 0; i < popA.length; i++) {            while (stack.isEmpty() || stack.peek() != popA[i]) {                if (popIndex > pushA.length - 1) {                    break;                }                stack.push(pushA[popIndex++]);            }            if (stack.peek() != popA[i])                break;            stack.pop();        }        if (stack.isEmpty())            bPopOrder = true;    }    return bPopOrder;

如有错误,往指正

原创粉丝点击