class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
if(pushed.empty() || popped.empty()) {
if(pushed.empty()&& popped.empty()) return true;
return false;
}
bool res=false;
stack<int> s;
queue<int> q;
for(int i:popped)
q.push(i);
s.push(pushed[0]);
int i=1;
while(!s.empty()||!q.empty()){//(2)循环终止条件出错点1,
if(!s.empty() &&(s.top()==q.front())){//(3)s栈可能暂时为空,前面加一个判断
s.pop();
q.pop();
}
else
{
if(i>=pushed.size()) {res=false;break;}
//(1)不等的时候,需要判定i是不是已经用光了,但是不等,这个时候就是匹配失败。
s.push(pushed[i]);
i++;
}
}
if(s.empty()&&q.empty()) res=true;
return res;
}
};
这题大致思路是对的,但是各种边界条件,导致没有一次通过。先说下整体思路,用栈模拟一个压栈出栈的过程,出栈序列,是先入先出的,所以用一个队列来存,一开始将出栈序列依次入队列,入栈序列第一个元素入栈;当栈不为空或者队列不为空时,循环判断,如果栈顶元素等于队列头,那么各自弹出一个元素,否则,判断入栈序列是否还有元素可以入栈,如果没有,说明没有匹配上,返回false,否则继续入栈。当循环结束时,必须栈和队列都空了才是正确匹配。
犯错有三个地方:(1)可能没匹配上,不是因为队列头元素还没入栈,比如 1,2,3,4,5 和4,3,5,1,2,前3,4,5都能匹配上,但是最后栈中剩1,2,队列中剩1,2,显然没匹配上,而此时入栈序列已经全部入栈了,再push就是数组越界了。
(2)循环终止条件出错,一开始写的是s.empty()&&q.empty(),举例1,0和1,0,1和1匹配,弹栈,此时队列中还有元素0,但是栈中暂时为空,所以还需要循环判断,而不是终止。另外s.top()的时候,先保证!s.empty(),q.front()时候,先保证!q.empty();只有可能栈短暂为空,队列如果为空了,那就是没有匹配的元素了。