题目:
链接:剑指 Offer 31. 栈的压入、弹出序列;LeetCode 946. 验证栈序列
难度:中等
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {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 之前弹出。
提示:
- 0 <= pushed.length == popped.length <= 1000
- 0 <= pushed[i], popped[i] < 1000
- pushed 是 popped 的排列。
栈模拟:
建立一个栈,按照入栈顺序压入元素,每一次压入时都检查栈顶元素是否符合出栈顺序,符合的元素就全部弹出,然后再进行下一次入栈,直到 pushed 序列全部入栈一遍。最后检查栈中是否还有没弹出的元素,如果有就判定为不符合弹出顺序,否则符合。文章来源:https://www.toymoban.com/news/detail-603889.html
代码:
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int n = pushed.size();
if(n == 0) return true;
stack<int> s;
int i = 0, j = 0; // 入栈序列和出栈序列的遍历位置
while(n--) {
s.emplace(pushed[i++]);
while(!s.empty() && s.top() == popped[j]) {
s.pop();
j++;
}
}
if(s.empty()) return true;
else return false;
}
};
时间复杂度O(N),空间复杂度O(N),N为序列长度。文章来源地址https://www.toymoban.com/news/detail-603889.html
到了这里,关于剑指 Offer 31. 栈的压入、弹出序列 / LeetCode 946. 验证栈序列(栈模拟)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!