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

一、题目

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

描述

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

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

  2. -1000<=pushV[i]<=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();
    }
相关推荐
YGGP25 分钟前
【Golang】LeetCode 32. 最长有效括号
算法·leetcode
自然常数e1 小时前
字符函数和字符串函数
c语言·算法·visual studio
youngee111 小时前
hot100-56最小栈
数据结构
leaves falling1 小时前
c语言分数求和
算法
Das11 小时前
【机器学习】01_模型选择与评估
人工智能·算法·机器学习
星轨初途1 小时前
郑州轻工业大学2025天梯赛解题
c++·经验分享·笔记·算法·链表·剪枝
不忘不弃2 小时前
从字符串中提取数字
数据结构·算法
点云SLAM2 小时前
C++ 引用折叠(Reference Collapsing)和示例讲解说明
数据结构·c++·标准算法·完美转发·代码性能优化·c++ 引用折叠·typedef / using
囊中之锥.2 小时前
《机器学习SVM从零到精通:图解最优超平面与软间隔实战》
算法·机器学习·支持向量机
chenyuhao20243 小时前
Linux网络编程:HTTP协议
linux·服务器·网络·c++·后端·http·https