通过模拟栈操作,判断给定的
popV
是否可能是pushV
的合法出栈序列。它通过逐个入栈pushV
的元素,并同时检查栈顶元素是否与popV
当前元素匹配,从而进行出栈操作。如果最终栈为空,说明popV
是合法的出栈序列;否则不合法。
代码:
class Solution {
public:
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
stack<int> s;
int pos1 = 0, pos2 = 0;
while (pos1 < pushV.size()) {
// 将 pushV[pos1] 入栈,并将 pos1 递增
s.push(pushV[pos1++]);
// 检查栈顶元素是否与 popV[pos2] 相等,如果相等则弹出栈顶元素并递增 pos2
while (pos2 < popV.size() && !s.empty() && s.top() == popV[pos2]) {
s.pop();
pos2++;
}
}
// 如果栈为空,说明所有元素都成功匹配,返回 true,否则返回 false
return s.empty();
}
};
详细解释
输入参数:
pushV
是一个整型向量,表示入栈顺序。popV
是一个整型向量,表示出栈顺序。- 函数返回一个布尔值,表示
popV
是否是pushV
的可能的弹出顺序。栈的使用:
stack<int> s;
声明一个栈s
用来模拟实际的压入和弹出操作。指针/索引:
pos1
指向当前处理的pushV
元素的位置。pos2
指向当前处理的popV
元素的位置。入栈操作:
在while(pos1 < pushV.size())
中,将pushV[pos1]
对应的元素入栈,同时将pos1
加 1。匹配出栈顺序:
- 在内层
while
循环中,代码检查以下条件:
popV[pos2]
是否等于栈顶元素s.top()
。- 如果相等,则栈顶元素出栈(使用
s.pop()
),并将pos2
加 1,处理下一个元素。- 这个过程会不断重复,直到当前的栈顶元素无法与
popV[pos2]
匹配,或者栈为空。最后返回结果:
return s.empty();
用于判断栈是否为空。如果popV
是pushV
的一个有效弹出序列,那么所有的元素都应该被匹配并且出栈,此时栈为空,返回true
。否则返回false
。
示例
举个例子,如果输入如下:
pushV = [1, 2, 3, 4, 5]
popV = [4, 5, 3, 2, 1]
代码将模拟栈操作,最终栈会为空,说明 popV
是一个可能的弹出序列,返回 true
。
但如果 popV = [4, 3, 5, 1, 2]
,经过模拟操作后栈不会为空,返回 false
,因为这个序列不是 pushV
的可能弹出序列。