文章目录
- 1. 题目描述
- 2. 解题思路
- 3. 动图演示
- 4. 代码实现
1. 题目描述
题目链接:31. 栈的压入、弹出序列
2. 解题思路
元素入栈指的是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
元素出栈指的是从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
如下图所示,给定一个压入序列 pushed 和弹出序列 popped,则压入 / 弹出操作的顺序(即排列)是 唯一确定 的。
如下图所示,栈的数据操作具有 先入后出 的特性,因此某些弹出序列是无法实现的。
所以这道题考虑借用一个辅助栈 stack,模拟 压入 / 弹出操作的排列。根据是否模拟成功,即可得到结果。
-
入栈操作: 按照压栈序列的顺序执行。
-
出栈操作: 每次入栈后,循环判断
"栈顶元素 == 弹出序列的当前元素"
是否成立,将符合弹出序列顺序的栈顶元素全部弹出。
具体做法:
(1)初始化: 定义辅助栈 st
,弹出序列的下标索引 i
(2)遍历压栈序列,元素入栈:循环出栈:若 st
的栈顶元素 == 弹出序列元素 popped[i]
,则执行出栈,然后再 i++
(3)返回值: 若 st
为空,则此弹出序列合法。
3. 动图演示
来看一个动图
4. 代码实现
代码示例
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
// 入栈和出栈的元素个数必须相同
if (pushed.size() != popped.size())
return false;
stack<int> st;
int i = 0;
for (auto e : pushed) {
st.push(e);
while (!st.empty() && st.top() == popped[i]) {
++i;
st.pop();
}
}
// 如果栈不为空,说明不匹配
return st.empty();
}
};