题目如下
题目描述
给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes
,否则输出 No
。为了防止骗分,每个测试点有多组数据。
输入格式
第一行一个整数 qq,询问次数。
接下来 qq 个询问,对于每个询问:
第一行一个整数 nn 表示序列长度;
第二行 nn 个整数表示入栈序列;
第二行 nn 个整数表示出栈序列;
输出格式
对于每个询问输出答案。
输入输出样例
输入 #1复制
2 5 1 2 3 4 5 5 4 3 2 1 4 1 2 3 4 2 4 1 3
输出 #1复制
Yes No
解题思路方法:
没啥好说的,直接上代码
#include <bits/stdc++.h>
using namespace std;
const int MAX = 100005;
const int INF = 0x7fffffff;
int N,Q;
int pushEd[MAX];
int popEd[MAX];
void solution() {
stack<int> si;
int index = 0;
for (int i = 0; i < N; ++i) {
si.push(pushEd[i]);
while(!si.empty()&&si.top()==popEd[index]) {
si.pop();
index++;
}
}
while (index<N){
if(si.top()==popEd[index]) si.pop();
else si.push(popEd[index]);
index++;
}
if(si.empty()) printf("Yes\n");
else printf("No\n");
}
int main() {
freopen("../data","r",stdin);
scanf("%d",&Q);
while (Q--) {
scanf("%d",&N);
for (int i = 0; i < N; ++i) {
scanf("%d",&pushEd[i]);
}
for (int i = 0; i < N; ++i) {
scanf("%d",&popEd[i]);
}
solution();
}
}