@TOC)
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
题目分析
这道题要注意的一点是,栈可以一边压入,一边弹出。而不是一次性按照压入顺序压入,再一次性弹出。
思路一:定义真实的stack来做比较
- 我们定义一个:真实的栈stack。
我们定义两个指针,i为压入顺序的指针,j为弹出序列的指针。
- 第一个循环,根据压入顺序不断把数字压入stack中,当栈顶元素等于弹出序列的第一个元素时,我们执行第二个循环。
- 第二个循环的目的是比较已经压入stack中的元素,和popV中的弹出序列是否相同,如果相同,就把stack中的元素弹出,循环遍历,直到stack中的元素与弹出序列中对应的元素不相同时,第二个循环结束,返回第一个循环。
第一个循环继续按照压入顺序,向stack中压入元素,直到当栈顶元素等于弹出序列的第一个元素时,我们执行第二个循环。
按照上述的循环,执行完popV中的压入顺序后,我们查看stack是否为空,为空的话,即返回true.
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()!=popV.size()&&pushV.size()==0)
return false;
stack<int> stack;
for(int i = 0,j = 0 ;i < pushV.size();){
stack.push(pushV[i++]);//不停的按照压入顺序将元素推入栈中
while(j < popV.size() && stack.top() == popV[j]){//当栈顶的元素等于弹出顺序的第j个元素时,循环执行
stack.pop();//将栈顶元素弹出
j++;//+1,后方便比较弹出顺序的第j+1个元素
}
}
return stack.empty();//如果栈为空,说明按照对应的pushV压入顺序压入,按照可能的popV弹出顺序弹出,可以最终使得对应stack为空
}
};
小结
这里只提供了通过实际构建一个stack,并模拟pushV压入顺序压入,popV的弹出顺序弹出,如果真的可行,那么栈一定是空的。
通过模仿我们具体的问题,来解决实际的问题也不失为一种好方法呢。
参考文献
《剑指offer》
牛课网刷题链接link.