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

博客围绕判断栈的压入弹出顺序展开。题目给出两个整数序列,需判断第二个序列是否为第一个序列对应的弹出顺序。分析指出栈可边压入边弹出,给出思路:定义真实栈和指针,通过循环模拟压入弹出过程,最后判断栈是否为空来确定结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值