题解 P4387 【【深基15.习9】验证栈序列】

· · 题解

手写是个好东西(当然STL库也可以)。

本题是想判断出栈序列是否成立,所以本蒟蒻用了离线操作。

此处简单介绍一下栈。

栈主要支持四种操作。

主要是作者只知道这4种。

  1. 入栈(push())
  2. 是否栈空(empty())
  3. 访问栈顶(top())
  4. 出栈(pop())

下文的top != 0 其实就是判断是否栈空。

简单的栈模拟,解释详见代码

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdlib>
#include <vector>
//这么多头文件实在煤必要,大家不要学这种蒟蒻。
using namespace std;
//定义栈,进栈数组,出栈数组。
int top,zhan[100010],n,jin[100010],chu[100010];
//对应STL库中的push操作,
void push(int x) {zhan[++top]=x;}
//pop操作。
void pop() {top--;}
int main()
{
    scanf("%d",&n);//读入。
    int len,js=1;
        //js是遍历出栈序列的变量,因为本蒟蒻的栈模拟push操作是++top,所以初始化js为1。
    for(int i=0;i<n;i++)//核心部分。
    {
        scanf("%d",&len);//输入访问序列长度。
                //读入不再多说。
        for(int j=1;j<=len;j++) scanf("%d",&jin[j]);
        for(int j=1;j<=len;j++) scanf("%d",&chu[j]);
        for(int j=1;j<=len;j++)
        {
            push(jin[j]);//进栈。
            while(zhan[top] == chu[js] && zhan[top] && chu[js]) {pop(); js++;}
        }//之所以用while循环,是因为可以简单直接的让相同元素出栈。
        if(top != 0) puts("No");//如果栈非空,失败。
        else puts("Yes");
        //初始化,进入下一轮访问。
        top=0;
        js=1;
    }
    return 0;
}

万恶的网课!

不好意思,作者已被网课逼疯。

管理员大大求过!