输入: 一个入栈序列 pushed 数组和一个出栈序列 popped 数组。
要求: 判断 popped 序列是否可能是 pushed 序列在某个栈上的合法出栈结果。
输出: true 或 false。
思路: 使用两个栈。(完全可以只用一个栈+原始popped数组就行)
- 一个
stackpush作为模拟栈,代表“当前状态”; - 一个
stackpop用来存储popped数组(倒序压入),代表“期望目标”。 - 遍历
pushed数组,将元素push到stackpush。 - 每
push一个元素后,立刻进入一个while循环,贪比较stackpush和stackpop的栈顶,如果相等,则将两个栈同时pop。
复杂度:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int len = pushed.size();
int i = 0;
stack<int> stackpush;
stack<int> stackpop;
for (int j = len - 1; j >= 0; j--) {
stackpop.push(popped[j]);
}
while (i < len) {
stackpush.push(pushed[i]);
i++;
while (!stackpush.empty() && !stackpop.empty() && stackpush.top() == stackpop.top()) {
stackpush.pop();
stackpop.pop();
}
}
if (stackpop.empty()) {
return true;
}
return false;
}
};
1629

被折叠的 条评论
为什么被折叠?



