题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列{1,2,3,4,5}是某栈的压入序列,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
1.解题思路:
- 可以构造一个辅助栈,按照第一个序列的顺序将数字逐个压入辅助栈,同时参考第二个序列的顺序不时地弹出相应的数字,如果两个序列都能按照顺序进行完压入和弹出的操作,则第二个序列是该栈的弹出顺序;
- 如果第二个序列下一个弹出的数字刚好是辅助栈的栈顶数字,则直接弹出;
- 如果第二个序列下一个弹出的数字不在辅助栈的栈顶,则继续压入第一个序列中未压入的数字,直到把下一个弹出的数字压入为止;
- 如果第一个序列的所有数字压入辅助栈后仍然没有找到下一个弹出的数字,那么第二个序列不是该栈的弹出序列。
牛客网通过,leetcode不通过!
2.代码:
class Solution{
public:
bool IsPopOrder(vector<int> pushV, vector<int> popV){
//第一个序列为空
if(pushV.size() == 0) return false;
//向辅助栈压入和弹出数据
for(int i = 0, j = 0; i < pushV.size(); i++){
//将第一个序列压入辅助栈
stackData.push(pushV[i]);
//当辅助栈的栈顶等于第二个序列下一个弹出数字时,直接弹出
while(j < popV.size() && stackData.top() == popV[j]){
stackData.pop();
j++;
}
}
//判断辅助栈是否全部弹出,
return stackData.empty();
}
private:
stack<int> stackData;
};