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

一、题目

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

描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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();
    }
相关推荐
气泡音人声分离9 小时前
技术解析|均衡器(EQ)工作原理与实操指南:从频率拆分到听感优化
算法·均衡器·音频剪辑
weixin_413063219 小时前
复现 MatchED 边缘检测模型(单张图片重复8次,训练200 epoch)
python·算法·计算机视觉·边缘检测模型
2601_962440849 小时前
计算机毕业设计之jsp教室管理系统
java·开发语言·笔记·分布式·算法·课程设计·推荐算法
AI视频剪辑官9 小时前
播客切片工具选型核心评价维度
网络·人工智能·算法
复杂网络12 小时前
AI 不睡觉,但它比你更会做实验
算法
贵慜_Derek12 小时前
MAI-04|干净数据在工程上意味着什么:MAI 预训练数据治理
人工智能·算法·llm
unicrom_深圳市由你创科技12 小时前
数据库用SQLite还是SQL Server?工业数据存储选哪个?
c++
郝学胜_神的一滴13 小时前
CMake 037:宏传递流转机制与C++编译特性跨平台适配指南
c++·cmake
想吃火锅100514 小时前
【leetcode】146.LRU缓存js
算法·leetcode·缓存