东方博宜OJ 2228:出栈顺序 ← 栈

​​【题目来源】
https://oj.czos.cn/p/2228

【题目描述】
大家都知道,栈满足先进后出的特性。一个栈,如果按照 1,2,3,...,n 的顺序入栈,出栈顺序可以是:n,...,3,2,1。
考虑到栈可以边进边出,就可能产生多种不同的出栈序列,比如:入栈顺序是1,2,3,4,5,出栈顺序可能是:3,4,2,1,5,但不可能是:3,5,1,4,2。
请问:如果一个栈,按照 1,2,3,...,n 的顺序入栈,允许栈边进边出的情况下,判断出栈顺序是否合法。

【输入格式】
第 1 行读入一个整数 m,代表有多少组出栈的数据等待检测(m≤30)。
接下来读入 m 组数据,每组数据的第 1 行,读入一个整数 n,代表本组数据的出栈序列中有 n 个整数(1≤n≤100)。
每组数据的第 2 行,读入 n 个整数,数字之间用空格隔开。

【输出格式】
对于每组输入,请输出该组出栈序列是否合法,如果合法,请输出 Yes,不合法请输出 No。请注意,每组数据的输出占 1 行。​​​​​​​

【输入样例】
2
5
3 4 2 1 5
5
3 5 1 4 2​​​​​​​

【输出样例】
Yes
No

【数据范围】
m≤30,1≤n≤100

【算法分析】
● 若出栈序列是 3 5 4 2 1,则模拟过程如下:
① 初始栈为空。
② 第 1 个出栈的是 3,3 不在栈中,1,2,3 进栈,3 出栈,此时栈为{1,2} 。
③ 第 2 个出栈的是 5,5 不在栈中,4,5 进栈,5出栈,此时栈为{1,2,4}。
④ 第 3 个出栈的是 4,4 为栈顶,4 出栈,此时栈为{1,2}。
⑤ 第 4 个出栈的是 2,2 为栈顶,2 出栈,此时栈为{1}。
⑥ 第 5 个出栈的是 1,1 为栈顶,1 出栈,此时栈为为{}。
模拟过程显示没有出栈的元素在栈中但不是栈顶元素的情况, 所以该方案可行。

●​​​​​​​ “信息学奥赛一本通1357:车厢调度(train) → https://blog.csdn.net/hnjzsyjyj/article/details/146491629”​​​​​​​是单组数据,本题是多组数据。除此之外,两者代码基本一样。

#include<bits/stdc++.h>
using namespace std;

const int maxn=1005;
int s[maxn],a[maxn];

int main() {
    int n;
    cin>>n;
    for(int i=1; i<=n; i++) cin>>a[i];

    int top=0,cur=1;
    bool flag=true;
    for(int i=1; i<=n; i++) {
        while(cur<=a[i]) s[++top]=cur++;
        if(s[top]==a[i]) top--;
        else {
            flag=false;
            break;
        }
    }
    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;

    return 0;
}

/*
in:
5
5 4 3 2 1

out:
YES
*/

【算法代码】

#include<bits/stdc++.h>
using namespace std;

const int maxn=105;
int s[maxn],a[maxn];

int main() {
    int T;
    cin>>T;
    while(T--) {
        int n;
        cin>>n;
        for(int i=1; i<=n; i++) cin>>a[i];

        int top=0,cur=1;
        bool flag=true;
        for(int i=1; i<=n; i++) {
            while(cur<=a[i]) s[++top]=cur++;
            if(s[top]==a[i]) top--;
            else {
                flag=false;
                break;
            }
        }
        if(flag) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

/*
in:
2
5
3 4 2 1 5
5
3 5 1 4 2

out:
Yes
No
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/146491629

 

​

posted @ 2026-08-19 22:21  Triwa  阅读(10)  评论(0)    收藏  举报