package com.example.lettcode.offer;
import java.util.Stack;
/**
* @Class ValidateStackSequences
* @Description 剑指offer 31 栈的压入、弹出序列
* 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
* 假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈
* 的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,
* 但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
* <p>
* 示例 1:
* 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
* 输出:true
* 解释:我们可以按以下顺序执行:
* push(1), push(2), push(3), push(4), pop() -> 4,
* push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
* <p>
* 示例 2:
* 输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
* 输出:false
* 解释:1 不能在 2 之前弹出。
* <p>
* 提示:
* 0 <= pushed.length == popped.length <= 1000
* 0 <= pushed[i], popped[i] < 1000
* pushed 是 popped 的排列。
* @Author
* @Date 2020/7/17
**/
public class ValidateStackSequences {
// 使用辅助栈
public static boolean validateStackSequences(int[] pushed, int[] popped) {
if (pushed.length != popped.length) return false;
Stack<Integer> integerStack = new Stack<>();
int locationFirst = 0;
int locationSecond = 0;
while (locationFirst < pushed.length && locationSecond < popped.length) {
// 栈为空或者栈顶元素与poped 当前元素不相同,则pushed元素入栈
while (integerStack.isEmpty()
|| (locationFirst < pushed.length && integerStack.peek() != popped[locationSecond])) {
integerStack.push(pushed[locationFirst]);
locationFirst++;
}
// 栈顶元素和poped当前元素相等则栈顶出栈
while (!integerStack.isEmpty()
&& locationSecond < popped.length
&& integerStack.peek() == popped[locationSecond]) {
integerStack.pop();
locationSecond++;
}
}
// 结束循环,判断两指针是否均指向最后一个元素的位置,即是否相等
return locationFirst == locationSecond;
}
public static void main(String[] args) {
int[] pushed = new int[]{1, 2, 3, 4, 5};
int[] poped = new int[]{4, 5, 3, 2, 1};
boolean ans = validateStackSequences(pushed, poped);
System.out.println("ValidateStackSequences demo01 result:" + ans);
pushed = new int[]{1, 2, 3, 4, 5};
poped = new int[]{4, 3, 5, 1, 2};
ans = validateStackSequences(pushed, poped);
System.out.println("ValidateStackSequences demo02 result:" + ans);
}
}