a[i] = 0 未进stack
a[i] = 1 已在stack
a[i] = 2 已出stack
正确的两种情况
1.若s.top == sequence[i] pop之
2.若s.top != sequence[i] 将小于sequence[i]的且未在stack内,也未出stack的push进去,并且s.size < capacity
#include<stdio.h>
#include<stack>
using namespace std;
bool CheckStack(int sequence[], int n, int capacity){
int *a = new int[n + 1];
int i,j;
for (i = 1; i <= n; i++)
a[i] = 0;
stack<int> s;
int flag;
for (i = 0; i < n; i++){
flag = 0;
if (s.size() == 0){
for (j = 1; j <= sequence[i]; j++)
if (!a[j]){
a[j] = 1;
s.push(j);
}
if (s.size() > capacity)
break;
}
if (s.top() == sequence[i]){
s.pop();
a[sequence[i]] = 2;
flag = 1;
}
else if (s.top() != sequence[i] && a[sequence[i]] == 0){
for (j = 1; j <= sequence[i]; j++)
if (!a[j]){
a[j] = 1;
s.push(j);
}
if (s.size() > capacity)
break;
s.pop();
a[sequence[i]] = 2;
flag = 1;
}
if (!flag)
break;
}
if (i == n)
return true;
else return false;
}
int main(){
freopen("1.in", "r", stdin);
int n, times, capacity;
scanf("%d%d%d", &capacity, &n, ×);
int *a = new int[n];
int i;
while (times--){
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
bool flag = CheckStack(a, n, capacity);
if (flag)
printf("YES\n");
else printf("NO\n");
}
return 0;
}