「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」
前言
今天这道题,着实令人迷糊,验证栈序列,需要多琢磨一下,不知道在看的各位感觉怎么样,废话不多说,直接进入正题。
题目描述
946. 验证栈序列
给定 pushed 和 popped 两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目解析
-
首先分析下题目后半段,‘只有当它们可能是在最初空栈上进行的push和pop操作序列的结果时’,这句话表明,题目前部分给定的两个栈序列,如果能
在一个空栈上经过push和pop操作得来,那么就返回true,否则就是false; -
那么我们就先初始化一个空栈,按题目要求,在栈中push的值为归为push序列的值,执行pop操作返回的值就归到pop序列中,只要最后能得到跟题目指定的两个序列,并且栈为空,那么就说明我们本题验证栈序列的结果为true;
-
既然我们要同时得到两个序列,那我们
先假设push序列是ok的,这样我们就可以依照这个序列进行操作,看能否在空栈中执行push操作的时候,得到pop序列中需要的值。 -
我们遍历pushed栈序列往空栈中push值,如果空栈栈顶元素和poped栈第一项相等,那么空栈执行栈顶出栈,poped第一项出栈,直至poped为空,如果
pushed序列遍历完之后,空栈为空,poped栈为空,说明我们验证栈序列成功。
开始解题
var validateStackSequences = function(pushed, popped) {
let empty = []; // 初始化一个空栈
while(pushed.length) { // 遍历pushed栈
empty.push(pushed[0]); // 每次往空栈里入栈pushed的第一项
while(empty[empty.length-1] === popped[0]){ // 判断empty栈顶元素与popped头部元素是否相等
empty.pop();
popped.shift();
if(!popped.length) break; // popped栈为空说明,popped序列验证成功
}
pushed.shift();
}
return empty.length === 0 && popped.length === 0; // empty与popped均为空才说明验证栈序列陈宫
};