栈的压入弹出序列
/* 剑指offer31:栈的压入、弹出序列
* 题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
* 假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,
* 序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,
* 但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
* 解题思路:
* 12345的入栈顺序是否能得到45321的出栈顺序,第一个出栈的是4,1234入栈4出栈
* 栈内余123,下一个出栈的是5,栈顶不是5,剩余未入栈的入栈直到有5,5入栈,5出栈
* 栈内余123,下面要出栈的是321都能出栈,栈空返回true
*
* 12345入栈,43512出栈,4要出栈,将待入栈序列入栈,直到遇到4,1234入栈,4出栈
* 栈内余123,3要出栈,栈顶为3,3出栈,5要出栈、栈顶非5,剩余序列入栈,5入栈、5出栈
* 栈内余12,1要出栈,栈顶不是1,待入栈序类为空,返回false;
*
* 遍历入栈序列
* 入栈元素依次入栈。
* 栈顶元素非空且等于出栈元素的时,栈顶出栈
* */
public class ZhanDeYaRuDanChuXuLie {
public static void main(String[] args) {
int[] pushed = {1,2,3,4,5};
int[] popped = {4,3,5,1,2};
ZhanDeYaRuDanChuXuLieSolution solution = new ZhanDeYaRuDanChuXuLieSolution();
System.out.println(solution.validateStackSequences(pushed, popped));
}
}
class ZhanDeYaRuDanChuXuLieSolution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
int poppedP = 0;
Stack<Integer> stack = new Stack<Integer>();
for (int elment : pushed) {
stack.push(elment);
while(!stack.isEmpty()&&stack.peek()==popped[poppedP]) {
stack.pop();
poppedP++;
}
}
return stack.isEmpty();
}
}