首页 > 技术文章 > 数据结构 | 栈:1051

TQCAI 2018-03-10 14:15 原文

这是一个栈的模拟题,同时“通过出栈序列判断是否合理”这样的考法在考研中经常遇到,也很有可能被命致为考研算法题,这类题的解题方法值得深究。

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;
}

 

推荐阅读