题解 P4387 【【深基15.习9】验证栈序列】
手写是个好东西(当然STL库也可以)。
本题是想判断出栈序列是否成立,所以本蒟蒻用了离线操作。
此处简单介绍一下栈。
栈主要支持四种操作。
主要是作者只知道这4种。
- 入栈(push())
- 是否栈空(empty())
- 访问栈顶(top())
- 出栈(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;
}
万恶的网课!
不好意思,作者已被网课逼疯。