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

一、题目

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

描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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();
    }
相关推荐
Jerry2 小时前
LeetCode 189. 轮转数组
算法
Jerry3 小时前
LeetCode 739. 每日温度
算法
2601_954526757 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
code_pgf8 小时前
`unordered_map` 详解
c++
叩码以求索8 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
一拳一个呆瓜10 小时前
【STL】iostream 编程:检测提取操作产生的错误
c++·stl
稚南城才子,乌衣巷风流10 小时前
判断素数与拓展应用
c++
众少成多积小致巨10 小时前
C++ 规范参考(下)
c++
c2385610 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa11 小时前
指针之总结
c语言·笔记·算法