栈的压入,弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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; } }