问题描述
小Hi正在研究一种特殊的栈。这种栈的元素既可以从栈顶出栈,也可以从栈底出栈。(进栈还是只能从栈顶进栈)
已知入栈的序列是1~N的一个排列,请你判断出栈序列能否是1, 2, 3, … N?
输入格式
输入包含多组数据。
输入第一行包含一个整数T,代表测试数据的组数。
以下每组数据占据2行。
第一行包含一个整数N。
第二行包含N个整数,整数中由空格隔开。表示入栈序列。
输出格式
对于每组数据输出YES或者NO,代表出栈序列能否是1, 2, 3, … N。
样例输入
2
5
2 4 1 3 5
5
4 3 1 5 2
样例输出
YES
NO
数据规模和约定
对于30%的评测用例,1 <= N <= 10
对于80%的评测用例,1 <= N <= 10000
对于所有评测用例,1 <= N <= 100000, 1 <= T <= 10。
代码:
#include<iostream>
#include<deque>
using namespace std;
int a[10][100005];//代表T和N的范围,稍微大一点
int main()
{
int T,N;
scanf("%d",&T);
for(int i = 0; i < T; i++){
scanf("%d",&N);
for(int j = 0; j < N; j++){
cin>>a[i][j];
}
}
int flag = 1;//标志为1,表示1先出
deque<int> q;//定义双端队列q
for(int i = 0; i < T; i++){
for(int j = 0; j < N; j++){
q.push_back(a[i][j]);//插入元素
if(a[i][j] == flag){//如果插入的元素为1,则释放,标志变为2
q.pop_back();
flag++;
}
while (!q.empty() && q.front() == flag)//队列不为空且队首等于标志,如上
{
q.pop_front();
flag++;
}
while (!q.empty() && q.back() == flag)//队列不为空且队尾等于标志,如上
{
q.pop_back();
flag++;
}
}
if(flag == N + 1){//标志按顺序输出会自加五次,加上本身标志为1
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
flag = 1;//一次数据结束,从设标志为1
}
return 0;
}