题目
给定
pushed和popped两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入push和弹出pop操作序列的结果时,返回true;否则,返回false。
示例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 之前弹出。
- 难度:中等
- 使用语言:TypeScript
- 链接: 验证栈序列
这是一道标准的用栈(先进先出)来解决的问题,题目难度为中等,不过这道题目并不难,注意维护一个栈,如果这个栈最后被清空掉了,则输出true,否则输出false。那么怎么来维护这个栈呢?
- 我们定义一个数组temp,一个指针j,一开始指向poped的第0个数据。
- 遍历pushed,根据pushed的顺序把数字入栈。
- 入栈后检查一下栈数据的最后一位数据n,是否和指针指的数字k一致,如果一致则把数据出栈,并把指针往后移动一位,直到n和k不一样为止。
- pushed遍历结束后,如果temp中还有数据证明不可以按照题目的意思弹出数据,返回false,否则返回true。
上代码
function validateStackSequences(pushed: number[], popped: number[]): boolean {
let temp: number[] = []
let j = 0
for (let i = 0; i < pushed.length; i++) {
temp.push(pushed[i])
while(temp.length && temp[temp.length - 1] === popped[j]) {
temp.pop()
j++
}
}
return temp.length === 0
};
总结
- 其实题目也表达的很明显了要用栈的方法解决问题,能想到的话解决起来并不困难。
- 类似数据输入输出顺序来解决问题的,都可以尝试用队列/栈来解决问题,只要把队列/栈维护好,这类问题基本都挺好解决。