2021-10-31 剑指 Offer 31. 栈的压入、弹出序列

问题描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
在这里插入图片描述
解题思路:
拿到这个题我开始想的是能不能找规律,看有没有规律可寻找,但是没有找到。
然后我又想到了另一种方法,模拟出栈顺序,如果能模拟出来,那么就能够判断是否为正确的出栈顺序。

  1. 创建一个stack st;
  2. 每次取pushed的元素入栈st
  3. 入栈元素如果与poped第一个元素相同,则poped下标向后移动,st.pop();直到元素不相等,则退出本次循环,重复2。
  4. 直到pushed走到末尾。

代码如下:

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        int j=0;//用来标识poped的下标
        for(int i=0;i<pushed.size();i++)
        {
        /*其实这里可以优化,不需要判断语句,因为每次for循环上来都要入数据。*/
            if(_push.empty()|| _push.top()!=popped[j])
            {
                _push.push(pushed[i]);
            }
            /*这里就是连续判断*/
            while(!_push.empty() &&_push.top()==popped[j])
            {
                _push.pop();
                ++j;
            }
        }
        //如果最后_push为空,则说明可以模拟,则此出栈顺序正确。
        if(_push.empty())
        {
            return true;
        }
        else
        {
            return false;
        }


    }
private:
        stack<int> _push;

       
        
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜杜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值