剑指 Offer 31. 栈的压入、弹出序列 && Leetcode 946. 验证栈序列
地址 https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如,序列 {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 的排列。 注意:本题与主站 946 题相同:https://leetcode-cn.com/problems/validate-stack-sequences/
解答
我们使用一个stack数据结构来模拟即可。
由于栈的本身是先入后出而且只能弹出栈顶元素,题目也提到压入栈的元素都不相等。
那么弹出的执行只能在压入该元素且没有压入其他元素时候进行操作。
也就是该元素刚刚压入栈在栈顶的时候,且该元素也是pop序列的当前元素,我们将它弹出
既然没有分支没有其他选择,我们进行模拟该操作,查看最后能否弹出全部元素即可
图示
1
2
3
4
class Solution { public: stack<int> st; bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { int popidx = 0; for(int i = 0; i < pushed.size();i++ ){ while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){ st.pop();popidx++; } st.push(pushed[i]); } while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){ st.pop();popidx++; } return st.empty(); } };
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
![阿里打赏](https://files.cnblogs.com/files/itdef/ali2.bmp)
![微信打赏](https://files.cnblogs.com/files/itdef/weixin2.bmp)