栈的压入弹出序列验证算法详解
给定两个整数序列,一个是压栈顺序 pushV,另一个是待验证的弹栈顺序 popV。我们需要判断 popV 是否可能是 pushV 对应的合法弹栈序列。
核心思路
解决这个问题的关键在于理解栈的后进先出(LIFO)特性。我们不需要真的去尝试所有可能的组合,而是可以通过模拟整个压栈和弹栈的过程来验证。
具体策略如下:
- 按序压栈:按照
pushV的顺序依次将元素压入辅助栈。 - 即时匹配:每次压栈后,检查栈顶元素是否与
popV当前期望弹出的元素一致。 - 贪心弹出:如果一致,立即弹出栈顶元素,并移动
popV的指针继续检查下一个;如果不一致,则继续压入下一个元素。 - 最终判定:当所有元素都处理完毕后,如果辅助栈为空,说明序列合法;否则不合法。
这种模拟方法利用了贪心思想,一旦栈顶匹配就立刻弹出,因为栈的特性决定了如果现在不弹,后续更深的元素就无法在需要时先出来。
代码实现
下面是基于 C++ STL 的实现,使用了 std::stack 和双指针技巧。
#include <vector>
#include <stack>
using namespace std;
class Solution {
public:
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
// 边界检查:长度不一致直接返回 false
if (pushV.size() != popV.size()) {
return false;
}
stack<int> st;
size_t _push = 0; // 指向当前要压入的元素索引
size_t _pop = 0; // 指向当前要弹出的元素索引
// 遍历所有需要压入的元素
while (_push < pushV.()) {
st.(pushV[_push++]);
(!st.() && st.() == popV[_pop]) {
_pop++;
st.();
}
}
st.();
}
};


