1. 题目来源
链接:验证栈序列
来源:LeetCode
2. 题目说明
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
示例1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed
是popped
的排列。
3. 题目解析
方法一:建立辅助栈、模拟出栈
建立两个栈进行模拟出栈操作,先将 popped
倒序全部压入栈s2
中,再针对 pushed
进行顺序逐个压入栈s1
,并在循环内部判断,该压入元素即 s1.top()
是否等于 s2.top()
,在此需要采用while
循环判断,若在 while
内部栈 s1
为空,应当直接 break
跳出 while
循环,否则再进行while
循环判断s1.top()
出错。当 for
循环结束后意味着所有元素都已经完成了压栈操作,若栈 s1 为空,则模拟出栈成功,否则失败,在此直接返回s1.empty()
即可,由于pushed
是 popped
的排列,返回s1.empty()
也可。
参见代码如下:
// 执行用时 :8 ms, 在所有 C++ 提交中击败了93.62%的用户
// 内存消耗 :9.6 MB, 在所有 C++ 提交中击败了5.30%的用户
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> s1, s2;
for (int i = popped.size() - 1; i >= 0; --i)
s2.push(popped[i]);
for (int i = 0; i < pushed.size(); ++i) {
s1.push(pushed[i]);
while (s2.top() == s1.top()) {
s1.pop();
s2.pop();
if (s1.empty())
break;
}
}
return s1.empty();
}
};