《剑指offer》面试题31:栈的压入、弹出序列(C++实现)

    xiaoxiao2025-02-01  47

    @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.

    最新回复(0)