(stack栈)rails

题目:
某城市有一个火车站,铁轨铺设如图所示,有n节车厢从A方向驶入车站,按进站顺序编号为1至n。你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出车站。例如:出站顺序(5,4,1,2,3)是不可能的,而(5,4,3,2,1)是可能的。对于每节车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择A->C和C->B。

现在给你一种1到n的排列,请你判断是否是题目描述的一种可能,如果是请输出yes,否则输出no
输入
两行,第一行有一个正整数n,表示有n节车厢,第二行有n个正整数,即1到n的一种排列,两两之间有一个空格分隔。
输出
yes或者no
输入示例
5
5 4 1 2 3
输出示例
no

分析与解答:

原数组元素:1到n
目标数组元素:输入
栈:从栈顶到底,n到1
推论:出栈顺序要么是(进一个出一个),要么是栈顶出栈(进多个出一个)
1.当原数组元素等于目标数组元素时,先进栈再出栈即可,
2.否则判断栈顶元素是否等于目标数组,若相等栈顶元素出栈,
3.若不相等在数组不为空的情况下将原数组元素入栈。
4.若都不满足说明不符合条件,flag = 0,break。

#include<cstdio>
#include<stack>
using namespace std;
const int MAX=1000+10;

int n,target[MAX];

int main(){
    while(scanf("%d",&n)==1){
        stack<int> s;
        int a=1,b=1;
        for(int i=1;i<=n;++i)
        scanf("%d",&target[i]);
        int ok=1;
        while(b<=n){
            if(a==target[b]){
                a++;b++;
            }
            else if(!s.empty()&&s.top()==target[b]){
                s.pop(); b++;
            }
            else if(a<=n) s.push(a++);
            else {
                ok=0;break;
            }
        }
        printf("%s\n",ok?"Yes":"No");
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/81179207