思路:利用数据结构栈的知识解决。每次压栈,用top处的值和输入的出栈序列进行比较,是否相等。不等,继续压栈。相等,则出栈,并且让current后移一位,指向出栈序列的下一位下标。用bool型变量flag记录是否合法,最后再判断flag值是否为true。
注意:
- 每次进行输入出栈序列前,要让栈清空,C++没有clear功能,只能循环pop。
- 如果栈超出了大小,则不合法,直接退出循环。
- 每次用到top和pop,都要先判断栈是否为空,否则会出现“答案错误”或者“段错误”。
- 最后判断flag是否为true前,还要再判断一次栈内元素是否全部出栈,否则会出现“答案错误”。
- 开的数组要尽量大一点,否则会出现段错误。我试了一下,开800以下都是错的,开1000就没问题了。
代码:
#include<cstdio>
#include<stack>
using namespace std;
stack<int> st;
#define N 1000 //数组小于1000会出现段错误
// bool flag = false;
int main(){
int m,n,x;
scanf("%d %d %d",&m,&n,&x);
int a[N]={0};
// int current = 1; //放进循环里,因为每一次循环current都要从1开始
for(int i = 1;i <= x;i++){
while(!st.empty()) st.pop(); // C++中没有直接清楚stack的功能,所以要用pop
for(int j = 1;j <= n;j++){
scanf("%d",&a[j]);
}
int current = 1; //每一次循环开始,current置为1
bool flag = true; //每一次循环开始,flag置为true
for(int k = 1;k <= n;k++){ //这里是k和n进行比较
st.push(k); //把k压入栈
if(st.size() > m){ //如果栈内元素数目大小大于最大容量m,则表示栈已满,不合法,退出循环
flag = false;
break;
}
while(!st.empty()&&st.top() == a[current]){ //做top前要先判断栈是否为空,这里要用循环,因为只要一直满足条件,就一直出栈
flag = true;
st.pop(); //出栈
current ++; //current指向数组a下一个下标
}
}
if(st.empty() == true&&flag == true){ //判空,表示栈内元素已经全部出栈
printf("YES");
if(i!=x) printf("\n");
}
else{
printf("NO");
if(i!=x) printf("\n");
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。