「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
示例 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
示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] 输出:false 解释:1 不能在 2 之前弹出。
解法1:模拟
步骤分析:直接模拟,初始化栈s1和一个num=0。每压入一个元素后,我们都判断一下该元素是否和popped中num位置的元素相等,即是否有要出栈的元素,若相等说明可以出栈,则需要循环判断当前元素出栈后的栈顶元素是否和popped中下一位置的元素相等,最后若num和序列长度相同说明每个元素均出栈,不等则说明出栈的元素不够,返回false
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack<Integer> stack = new Stack<>();
int i = 0;
for(int j:pushed){
stack.push(j);
//碰到栈顶与弹出数组元素相同时,开始弹出,弹出后,数组指针向后移,继续对比是否相同,如果相同继续弹出,不相同,则将push数组中的元素加入,
while (i<popped.length&&!stack.isEmpty()&& stack.peek() == popped[i]){
stack.pop();
i++;
}
}
return stack.isEmpty();
}
}
小结:
总体的思路就是建立一个模拟栈,循环操作,判断模拟栈的栈顶元素是否和出栈序列的首元素相同,相同则弹出,不相同,就把入栈序列的元素按顺序压入,然后再判断是否相同,这个循环会在入栈序列为空后终止。当模拟栈不为空时,比较模拟栈和出栈序列首元素,不相同则说明后面的所有序列都无法匹配,返回false 否则,把出栈首元素弹出