剑指offer_ C++ 栈的压入、弹出序列

 建一个辅助栈,模拟序列1按序列2顺序的出栈,如1,2,3,4,5和4,5,3,2,1

序列1为空时,首先压入1,序列2的首元素4,不等于当前栈顶,继续压入2,依然不等,继续压入3.........压入4,当前栈顶元素等于序列2的首元素4,此时将4弹出,序列2元素索引加1,此时指向5。

此时栈顶元素为3,不等于5,继续压入序列1的5元素,此时相等,则将栈顶元素5弹出,序列2的索引加1,此时指向3。

此时栈顶元素为3,二者相等,则弹出栈顶元素,序列2索引加1,指向2。

此时栈顶元素为2,与序列2指向元素相等,继续上述操作,直至序列2指向最后一个元素,并且栈中元素全部匹配弹出。此时可判断序列2是序列1的弹出序列。

代码如下:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        int len1=pushV.size();
        stack<int> s1;
        int i=0;
        int j=0;
        while(j<len1)  //序列2中元素全部遍历完时,则停止循环
        {
           while(s1.empty()||s1.top()!=popV[j])
           {
               if(i>len1-1)   //序列1中元素全部压入时,则停止
                   break;
               s1.push(pushV[i]);
               i++;
           }
           if(s1.top()!=popV[j])//按照栈的特性,如果上面的子循环结束时栈顶元素和序列2指向的元素
                                //不等,则表示序列2不是序列1的弹出序列,直接break。
               break;
           s1.pop();
           j++;
        }
       if(s1.empty())
           return true;
        else
            return false;
    }
};

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值