一、题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如,序列 {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 的 进出栈顺序来梳理 该出栈顺序是否正确
规律总结:
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;
}
};