LeetCode - 946. 验证栈序列
题目
946. 验证栈序列 - 力扣(LeetCode)
这道题是验证栈序列,我们需要判断一个序列是否可能是另一个序列的入栈出栈结果。看到这个问题,我首先想到的是模拟栈的操作过程。
我的思路是这样的:
- 创建一个栈来模拟入栈出栈的过程
- 遍历pushed序列,将元素依次入栈
- 每次入栈后,检查栈顶元素是否与popped序列的当前元素匹配
- 如果匹配,就将栈顶元素弹出,并移动popped序列的指针
- 继续这个过程,直到处理完pushed序列
- 最后检查栈是否为空,如果为空,说明序列有效
举个例子,以示例1为例:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
- 将1入栈,栈变成[1],检查栈顶1是否等于popped[0]=4,不等,继续
- 将2入栈,栈变成[1,2],检查栈顶2是否等于popped[0]=4,不等,继续
- 将3入栈,栈变成[1,2,3],检查栈顶3是否等于popped[0]=4,不等,继续
- 将4入栈,栈变成[1,2,3,4],检查栈顶4是否等于popped[0]=4,相等,弹出4,popped指针移动到5
- 将5入栈,栈变成[1,2,3,5],检查栈顶5是否等于popped[1]=5,相等,弹出5,popped指针移动到3
- pushed序列已经遍历完,但popped序列还有元素,继续检查栈顶
- 栈顶3等于popped[2]=3,弹出3,popped指针移动到2
- 栈顶2等于popped[3]=2,弹出2,popped指针移动到1
- 栈顶1等于popped[4]=1,弹出1,popped指针移动到末尾
- 栈为空,popped序列也处理完了,返回true
对于示例2:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
- 按照同样的过程模拟,会发现在某一步骤,栈顶元素与popped序列的当前元素不匹配,且pushed序列已经遍历完,无法继续入栈,此时返回false
这种方法的时间复杂度是O(n),其中n是序列的长度,因为我们只需要遍历一次pushed和popped序列。空间复杂度是O(n),主要是栈的空间。
这道题考察的是对栈这种数据结构的理解,以及如何通过模拟操作来验证序列的合法性。在实际编码中,我会注意处理边界情况,比如空序列或长度不匹配的序列
class Solution {
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> st;int popStr = 0;for(auto e : pushed){st.push(e);while(st.size() && st.top() == popped[popStr]){st.pop();popStr++;}}return st.empty();}
};