1077: 铁轨

题目描述

PopPush城市有一座著名的火车站。这个国家到处都是丘陵。而这个火车站是建于上一个世纪。不幸的是,那时的资金有限。所以只能建立起一条路面铁轨。而且,这导致这个火车站在同一个时刻只能一个轨道投入使用,因为它缺少空间,两列火车将无路可走。具体看下图。 
当地的惯例是每一列火车从A方向驶向B方向时候,会用某种方式将车厢重组。假设火车将要到达A方向,拥有N个车厢(N<=1000),这些车厢按照递增顺序标记为1到N。负责重组车厢的领导,必须知道是否能重组车厢让它驶出B,而这个重组的序列就是a1\a2\a3…aN.请帮助他写一个程序来判断是否可能按照所要求的车厢顺序。你可以假设,单个的车厢可以从列车上分离出来,在他们进入站台之前。并且他们可以自由移动,直到它们上了B轨道。你也可以假设在任意时候站台可以放下无数的车厢。但是只要一个车厢进入站台,它就不能返回A轨道,同时如果它离开了站台驶向B轨道,它就不能返回站台。 
 

输入

输入包含多组测试用例。 
对于每组测试用例,第一行包含一个正整数n(1<=n<=1000)。 
以下每一行包含n个数字,代表列车的驶出序列。 
每组测试用例以一个单独的0结尾。 
以一个单独的0作为结束输入。

输出

对于每一组测试样例的每一行,输出驶出顺序是否合法。 
测试样例间以空行进行分隔。 

样例输入

5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0

样例输出

Yes
No

Yes 

【思路】数字1~N依次存放在栈中,在将1~N存放同时,将栈顶元素与已存入数组中的元素进行比较,若相同,则将栈顶元素出栈,扫描数组的指针X移向下一个位置,若不同,则将数字1~N依次入栈,当N入栈后整个循环结束,此时判断栈是否为空,若空,则有效,反之,无效.注意输入输出格式.

#include <iostream>
#include <stack>
using namespace std;
int main() {
	int n, m;
	while (cin>>n&&n) {
		int num[n+1];
		while(cin>>num[1]&&num[1]){//一个n可能有多组数据,0作为结束 
			stack<int> s;
			int x=1;
			for (int i=2;i<=n;i++) 
				cin>>num[i];
			for (int i=1;i<=n;i++) {
				s.push(i);
				while (!s.empty()&&s.top()==num[x]) {
					x++;
					s.pop();
				}
			}
			if (s.size()==0)cout<<"Yes\n";
			else cout<<"No\n";
		}
		cout<<endl; 
	}
	return 0;
} 
发布了44 篇原创文章 · 获赞 1 · 访问量 2272

猜你喜欢

转载自blog.csdn.net/Do_________/article/details/104069674