> 文章列表 > 剑指 Offer 31. 栈的压入、弹出序列

剑指 Offer 31. 栈的压入、弹出序列

剑指 Offer 31. 栈的压入、弹出序列

一、题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如,序列 {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
解释:push(1),push(2),push(3),push(4),pop()->4,pop()->3,push(5)
,pop()->5,下一个应该 pop()->2,而不是 pop()->1, 1 元素在最底下,因此无法 pop 1,因此返回 false;

二、题目分析&解题思路

题目考察的是 出栈的顺序是否正确,那我们可以实际的用一个栈来模拟元素进出栈的过程,按照 pushed 的顺序进行 入栈,按照 poped 的顺序 进行出栈,且当栈顶元素等于 poped 的当前元素才可以出栈。最后栈中元素全部出栈视为出栈成功,否则就是错误的出栈顺序。

接下来我们以 示例 2 的 进出栈顺序来梳理 该出栈顺序是否正确
剑指 Offer 31. 栈的压入、弹出序列
规律总结:

pushed 里的元素 依次 压入栈,并遍历 poped 里的元素,看是否与栈顶元素相同,与栈顶元素相同 那么则需要出栈,元素继续入栈,同时继续往后遍历 poped 的元素判断是否与栈顶元素相同,而栈顶元素与当前元素不同不能出栈,最后判断该栈是否为空,为空则说明所有元素均以正确出栈,该出栈顺序正确,否则 是错误的出栈顺序

三、代码实现

class Solution {
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> stackIn;int i = 0;int j = 0;while(i< pushed.size()){//依次入栈stackIn.push(pushed[i]);//栈顶元素等于出栈元素 进行出栈while((!stackIn.empty()) && (stackIn.top() == popped[j] )){stackIn.pop();j++;}i++;}if(!stackIn.empty()){return false;}return true;}
};