OJ - 栈的压入、弹出序列
题目难度:中等
OJ链接:栈的压入、弹出序列__牛客网 (nowcoder.com)
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。
-
0 <= pushV.length == popV.length <= 1000
-
-1000 <= pushV[i] <= 1000
-
pushV 的所有数字均不相同
解题思路
题目给了一个入栈序列和出栈序列,我们定义一个栈,根据给的入栈和出栈顺序,来模拟入栈和出栈即可。
- 定义 pushi 和 popi 分别指向入栈序列和出栈序列的第一个元素,遍历序列。
- 依次遍历入栈序列 pushV 中的元素,向 st 中入栈:
- 如果 st 不为空,将 st 的栈顶元素和出栈序列 popV 中的元素进行比较:
- 如果相等,说明 st 的栈顶元素需要出栈了。
- 如果不相等,说明 st 的栈顶元素不需要出栈。
- 如果 st 为空,说明需要继续遍历入栈序列 pushV 中的元素,向 st 中入栈。
- 如果 st 不为空,将 st 的栈顶元素和出栈序列 popV 中的元素进行比较:
- 上面循环结束后,如果 st 为空,说明入栈序列和出栈序列匹配成功,返回 true。
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
stack<int> st; // 定义一个栈
size_t pushi = 0, popi = 0; // 指向入栈序列和出栈序列的第一个元素
// 遍历入栈序列
while (pushi < pushV.size()) {
st.push(pushV[pushi++]); // 将入栈序列的第pushi个元素入栈
// 遍历出栈序列,判断此时是否有元素需要出栈
// 如果栈不为空,且栈顶元素等于出栈序列的第popi个元素,说明第popi个元素需要出栈
while (!st.empty() && st.top() == popV[popi]) {
st.pop(); // 出栈
popi++; // 遍历出栈序列的下一个元素,判断其是否需要出栈
}
}
return st.empty(); // st为空,说明入栈序列和出栈序列中的元素全都被遍历完了,匹配成功
// return popi == popV.size(); // 出栈序列被遍历完了,说明入栈序列和出栈序列匹配成功
}
};