@TOC)
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
这道题要注意的一点是,栈可以一边压入,一边弹出。而不是一次性按照压入顺序压入,再一次性弹出。
第一个循环继续按照压入顺序,向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.