这是一个栈的模拟题,同时“通过出栈序列判断是否合理”这样的考法在考研中经常遇到,也很有可能被命致为考研算法题,这类题的解题方法值得深究。
1、既然是模拟入栈出栈行为,我们就让其不停的入栈,这是一个外循环。
2、如果入栈后超出了栈的规格,就退出循环。
3、在控制非空的条件下,如果栈顶与给定序列相同,那么说明出栈行为发生了,出栈。并且回到第三步再进行判断。
最后只要判断序列是否被模拟完即可。
AC代码:
#include <stdio.h> #include <stack> #include <algorithm> using namespace std; int main(){ // freopen("1051.txt","r",stdin); int m,n,k,i; int a[1001]; scanf("%d%d%d",&m,&n,&k); while(k--) { int cur=1; stack<int> s; for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++){ s.push(i); if(s.size()>m) break; while(!s.empty() && s.top()==a[cur]){ s.pop(); cur++; } } puts(cur==n+1?"YES":"NO"); } return 0; }