JZ21_栈的压入、弹出序列

JZ21_栈的压入、弹出序列

知识点:栈
题目链接

题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。

示例1
输入:[1,2,3,4,5],[4,3,5,1,2]
返回值: false

解题思路

  1. 看起来比较简单 但是实际做的时候没啥思路
  2. 首先定义两个指针i,j 分别指向 push 和 pop
  3. 移动指针,如果指针i和j对应的数不一样,就把i对应的压入栈,
  4. 如果一样,说明这个数可以直接放进弹出,两个指针都++,
  5. 然后判断pop顺序中的数,有可能来自栈中元素的弹出,也可能来自下个放入,所以这里尽可能的匹配栈中元素,如果栈头元素和弹出序列的一样弹出
  6. 最后判断栈中是否有元素 有则说明不可能是弹出顺序

代码

#include "cheader.h"
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        stack<int> s;
        int i = 0, j = 0 , n = pushV.size();
        while(i < n){
            if(pushV[i] != popV[j]){
                s.push(pushV[i]);
                i++;
            }else{
                i++;
                j++;
                while(s.empty()!=0 && s.top() == popV[j]){
                    s.pop();
                    j++;
                }
            }
        }
        return s.empty();
    }
};
int main()
{
    vector<int> pushV{1,2,3,4,5};
    vector<int> popV{4,3,5,1,2};
    Solution s;
    cout<<s.IsPopOrder(pushV, popV)<<endl;
    return 0;
}

今天也是爱zz的一天!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值