题目:
某城市有一个火车站,铁轨铺设如图所示,有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;
}
8.2号更新:
模拟了一下过程