栈的压入弹出序列--牛客

一、题目

链接 :栈的压入、弹出序列_牛客题霸_牛客网

描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

  1. 0<=pushV.length == popV.length <=1000

  2. -1000<=pushVi<=1000

  3. pushV 的所有数字均不相同

二、题解

本题需要了解栈的特性,栈的入栈出栈顺序不一定是全部入栈后再全部出栈,只要符合入栈出栈的规则即可。

本题思路在于模拟入栈出栈的过程,栈空时进行入栈,入栈的栈顶元素与出栈元素相同时出栈不同时进行入栈,因此本题遍历入栈序列时在栈不为空时每入栈一个元素进行一次判断,如果与出栈序列相同就出栈否则持续入栈,在此过程需要注意访问的范围的问题以及栈空的问题。

cpp 复制代码
   bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        stack<int> st;
        size_t n = pushV.size();
        //st.push(pushV[0]);
        size_t j = 0;
        size_t i = 0;
        while(i < n || j < n)
        {
            if(st.empty())
            {
                if(i >= n)
                {
                    return false;
                }
                st.push(pushV[i]);
                i++;
            }
            if(st.top() == popV[j])
            {
                st.pop();
                j++;
            }
            else 
            {
                if(i >= n)
                {
                    return false;
                }
                st.push(pushV[i]);
                
                i++;
            }
        }
        return st.empty();
    }

优化:每次都是先进行入栈直到相等需要出栈的时候,同时出栈时也需要注意栈为空的问题。出栈时可以连续的进行判断直到不需要出栈或者栈为空停止出栈。

cpp 复制代码
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        stack<int> st;
        size_t i = 0;
        for(auto& e : pushV)
        {
            st.push(e);
            while(!st.empty() && st.top() == popV[i])
            {
                st.pop();
                i++;
            }
        }
        return st.empty();
    }
相关推荐
2501_9269783344 分钟前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师1 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
无定义_1 小时前
10.11日常训练
算法
Code_Solitude1 小时前
c语言:关于qsoet函数知识点
c语言·数据结构·算法
Nil2081 小时前
leetcode 49字母异位分组
算法·leetcode·哈希算法
音草1 小时前
C++ 继承详解:从概念到菱形继承
c++
weixin_307779132 小时前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
行者全栈架构师2 小时前
【鸿蒙心迹】让应用“悬浮“起来——闪控球(floatingBall)从接入到实战全链路(HarmonyOS 7.x)
前端·算法·架构
云的雨 雨的云2 小时前
手写算法动画上位机:从排序到线性代数可视化
线性代数·算法
Pniubi2 小时前
快速排序(力扣基础)(递归)
java·数据结构·算法