网络知识 娱乐 猿创征文|【算法入门必刷】数据结构-栈(二)

猿创征文|【算法入门必刷】数据结构-栈(二)

【算法入门必刷】算法入门-数据结构-栈(二)

  • 前言
  • 算法入门刷题训练
    • 题目AB2: 栈的压入、弹出序列
      • 题目分析
      • 理论准备
      • 题解
  • 小结

📦个人主页:一二三o-0-O的博客
🏆技术方向:C/C++客户端资深工程师(直播+音视频剪辑)
👨‍💻作者简介:数据结构算法与音视频领域创作者
📒 系列专栏:牛客网面试必刷
📣专栏目标:帮助伙伴们通过系统训练,掌握数据结构与算法,收获心仪Offer
📝推荐一个找工作神器:牛客刷题网 【面试经验|实习招聘内推,求职就业一战解决】
🧡如果对您有帮助的话,欢迎点赞👍收藏📂,关注不迷路

前言

开启刷题,请点击右边链接进行跳转点击这里

在这里插入图片描述

算法入门刷题训练

题目AB2: 栈的压入、弹出序列

题目分析

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 的所有数字均不相同

根据题目描述是要验证提供的第一个序列表示栈的压入顺序,返回第二个序列是否可能为该栈的弹出顺序。对于第一个压入序列,只要辅助栈为空,就将元素依次入栈。遇到一个元素等于当前的第二个序列的元素,那就停止将第一个序列元素继续入栈,先出栈。如果能按照这个流程将两个序列都访问完,就返回true,否则返回false。

理论准备

首先我们要掌握stack的一些基础操作:

-----将元素入栈-----
std::stack mystack;
// 依次将元素1-10入栈
for (int i=1;i<=10;i++) mystack.push(i);

-----判断stack是否为空-----
std::stack mystack;
for (int i=1;i<=10;i++) mystack.push(i);
// 如果栈不为空,进入循环
while (!mystack.empty())
{
}

----获取stack中元素数量-----
std::stack mystack;
for (int i=1;i<=10;i++) mystack.push(i);
// 获取数量
int size = mystack.size();

-----获取栈顶元素-----
std::stack mystack;
for (int i=1;i<=10;i++) mystack.push(i);
// 获取栈顶元素
int topNum = mystack.top();

-----弹出栈顶元素-----
std::stack mystack;
int sum (0);
for (int i=1;i<=10;i++) mystack.push(i);
while (!mystack.empty())
{
sum += mystack.top();
// 弹出栈顶元素
mystack.pop();
}
std::cout << "total: " << sum << ‘n’;

题解

具体的解决方案如下:

  1. 利用stack声明一个辅助栈。然后分别访问提供的两个序列

// 获取序列的大小
int nPop = popV.size();
//记录访问第二个序列的下标
int index{};
//声明辅助栈
stack sPush;

  1. 辅助栈为空或者栈顶不等于第二个序列当前元素,就持续将第一个序列数组元素加入栈中。栈顶元素等于第二个序列数组就将当前元素就出栈。当第一个序列访问完,第二个序列无法依次弹出,就是不匹配,否则两个序列都访问就是匹配。

// 遍历第一个序列
for(int i{};i<nPop;++i){
// 获取第二个序列的当前元素
int target = popV[i];
//如果当前辅助栈为空或者辅助栈定元素不等于第二个序列的当前元素,就持续将第一个序列元素入栈
while(index < nPop && (sPush.empty() || sPush.top() != target)){
sPush.push(pushV[index++]);
}
// 栈顶元素等于第二个序列数组当前元素就出栈
if(sPush.top() == target){
sPush.pop();
}else {//第二个序列无法依次弹出,就是不匹配,返回false
return false;
}
}

模拟过程可参考下图:
请添加图片描述

  1. 完整代码如下:
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        int nPop = popV.size();
        int index{};
        stack<int> sPush;
        for(int i{};i<nPop;++i){
            int target = popV[i];
            
            while(index < nPop && (sPush.empty() || sPush.top() != target)){
                sPush.push(pushV[index++]);
            }
                  
            if(sPush.top() == target){
                sPush.pop();
            }else return false;
        }
        
        return true;
    }
};

当提交成功后,会展示如下界面,那么恭喜这道题目就通过了!
在这里插入图片描述

小结

祝愿所有的伙伴都能拿到自己心仪的Offer!📣伙伴们点击右边链接立刻开启刷题吧:牛客——刷题网