栈的压入,弹出序列

题目描述

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

笼统思路:遍历pop数组,对于每一个数,

1、如果该数与栈顶元素相同,则继续遍历下一个数,栈顶元素pop;

2、如果该数与栈顶元素不相同,则加入push队列中该数前的所有数,(PS:如果push数组没有该数,说明肯定是false)

 

具体思路:模拟栈,对于pop队列中的每一个元素num进行以下判断,用pos记录push数组还未遍历的部分,

1、栈顶为空或(栈顶元素与num不同且pos小于push数组长度时)时,从pos开始在push数组中遍历,将数加入栈s,直到找到与num相同的数,退出;  如果直到全搜完没找到num相同的,返回false


2、栈不为空且栈顶元素与num相同,栈pop;

 

3、其他情况,返回false

 

如果能成功模拟,即返回true;

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    Stack<Integer> s = new Stack<Integer>();
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        int j = 0;
        for(int i=0;i<popA.length;i++){
            int num = popA[i];
            if(s.isEmpty() || (s.peek()!=num && j<pushA.length)){
                int flag = 0;
                while(j<pushA.length){
                    if(pushA[j] == num){
                        j++;
                        flag = 1;
                        break;
                    }else{
                        s.push(pushA[j]);
                        j++;
                    }
                }
                if(flag == 0)   return false;
            }else if(!s.isEmpty() && s.peek() == num){
                s.pop();

            }else{
                return false;
            }
        }
        return true;
    }
}

 

posted @ 2019-04-06 16:44  萌新上路  阅读(128)  评论(0编辑  收藏  举报