題目如下
題目描述
給出兩個序列 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();
}
}