**
栈的压入、弹出序列
题目出处:https://www.acwing.com/problem/content/description/40/
样例:压入1 2 3 4,弹出4,压入5,弹出5 3 2 1,所以序列二符合要求,故结果为True。
解题思路,用栈一个个的读取压入序列中的每个数据,每次读取完全后,判断一下栈顶是否为弹出序列的当前值,如果是,要比较的值就变为弹出序列的下一个值,一直循环到当前栈顶元素与弹出序列当前值不相等为止,循环完毕后如果栈中元素为空,则说明弹出序列符合要求,反之不符合要求,举两个例子。
例1:压入[1 2 3 4 5]弹出[4 5 3 2 1]
Step 1 当前栈中元素1 弹出序列当前值4
Step 2 当前栈中元素1 2 弹出序列当前值4
Step 3 当前栈中元素1 2 3 弹出序列当前值4
Step 4 当前栈中元素1 2 3 4 弹出序列当前值4
Step 5 当前栈中元素1 2 3 弹出序列当前值5
Step 6 当前栈中元素1 2 3 5 弹出序列当前值5
Step 7 当前栈中元素1 2 3 弹出序列当前值3
Step 8 当前栈中元素1 2 弹出序列当前值2
Step 9 当前栈中元素1 弹出序列当前值1
Step 10 当前栈中元素NULL
所以弹出序列符合要求。
例2:压入[1 2 3 4 5]弹出[4 3 5 1 2]
Step 1 当前栈中元素1 弹出序列当前值4
Step 2 当前栈中元素1 2 弹出序列当前值4
Step 3 当前栈中元素1 2 3 弹出序列当前值4
Step 4 当前栈中元素1 2 3 4 弹出序列当前值4
Step 5 当前栈中元素1 2 3 弹出序列当前值3
Step 6 当前栈中元素1 2 弹出序列当前值5
Step 7 当前栈中元素1 2 5 弹出序列当前值5
Step 8 当前栈中元素1 2 弹出序列当前值1
Step 9 当前栈中元素1 2
所以弹出序列不符合要求。
参考AC代码如下:
class Solution {
public:
bool isPopOrder(vector<int> pushV,vector<int> popV) {
stack<int>s;
int len1 = pushV.size(),len2 = popV.size(),index = 0;
if(len1!=len2)return false;
if(!len1&&!len2)return true;
for(int i = 0;i<len1;i++){
s.push(pushV[i]);
while(!s.empty()&&s.top()==popV[index])index++,s.pop();
}
if(s.empty())return true;
else return false;
}
};