946. Validate Stack Sequences
思路:
刚开始看到这题,没能准确理解意思,直接用两个指针分别从pushed的第一个元素开始往后,从popped最后一个元素向前,然后比较,不相等就return false,然后错误,对比了一下例子发现
pushed=[1,2,3,4,5],popped=[4,5,3,2,1]而不是[5,4,3,2,1],所以他pop出去的中途还会push新元素进来。所以不能用上述的方法。
所以我们还需要用栈来模拟全过程。首先是定义一个cnt指针用来指向popped的元素,n为数组长度,遍历pushed的数组,并将遍历到的元素加入进栈,然后进入另一个循环,循环条件为判断栈是否为空,在判断cnt是否小于n,最后才判断st.top是否等于popped[cnt],如果相等就pop掉栈顶元素,并让cnt加一。因为这个popped为pushed进栈后出栈得到的,这个循环将会让栈为空,那么就该退出了,同时当cnt<n才能继续,然后是栈顶元素是否等于popped[cnt]这个就是用来判断是否是满足popped就是pushed元素出栈得到的,如果这两个循环结束后 cnt没能等于n,那么就相当于false了。
上述的循环条件位置不能乱,因为使用的相与,C++会判断第一个是否满足,如果不满足就不判断其他条件了。popped[cnt++]也不能放在循环条件,因为可能不被执行到,只能在循环里加入。
代码:
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int cnt=0;
int n=popped.size();
stack<int> st;
for(auto& a:pushed){
st.push(a);
while(!st.empty()&&cnt<n&&st.top()==popped[cnt]) { // 判断条件顺序不能乱,先确保其他的前提条件满足,才能判断是否相等。
st.pop();
cnt++;
}
}
return cnt==n;
}
};