剑指 Offer 31. 栈的压入、弹出序列https://leetcode.cn/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/
通过一个栈来模拟真实情况:
- 通过双指针遍历入栈/出栈序列
- 所有元素 按照入栈序列一个个依次入栈
- 每执行一次入栈操作,就检查是否满足出栈条件,按照出栈序列执行出栈操作
- 若能成功执行,最后栈应为空,入栈/出栈序列的双指针应指向末尾
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
// base case
if (pushed.empty())
{
return true;
}
if (pushed.size() != popped.size())
{
return false;
}
int n = pushed.size();
stack<int> s; // 用一个栈模拟真实情况
int i = 0, j = 0; // 双指针记录 入栈、出栈序列的下标
// 模拟所有元素入栈出栈的情况
while (i != n)
{
// 先入栈
s.push(pushed[i++]);
// 再出栈
while (!s.empty() && s.top() == popped[j])
{
s.pop();
++j;
}
}
// 只要最后所有入栈元素都能顺利出栈,即为true
return s.empty();
}