栈基础应用习题之火车进站

原UVA514铁轨改:

题目描述:

粗心的塔学长现在是火车站的调度员,看看现在的惨状吧,列车车厢的顺序竟然完全是乱的!为避免塔学长登上明天的UC头条,车站划分给塔塔一段如图所示的铁路,你能帮助塔塔把车厢的顺序调整好吗?

其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:列车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。

列车由编号依次为{1, 2, ..., n}的n节车厢组成。塔塔希望知道,按照以上交通规则,这些车厢能否以{a1, a2, ..., an}的次序,重新排列后从B端驶出。如果可行,应该以怎样的次序操作?

输入:

共两行。 
第一行为两个整数n,m。 
第二行为以空格分隔的n个整数,保证为{1, 2, …, n}的一个排列,表示待判断可行性的驶出序列{a1,a2,…,an}。

输出:

若驶出序列可行,则输出操作序列,其中push表示车厢从A进入S,pop表示车厢从S进入B,每个操作占一行。
若不可行,则输出“震惊!昨天小汤河火车站竟然。。。”。

样例输入

5 2
1 2 3 5 4

样例输出

push
pop
push
pop
push
pop
push
push
pop
pop

鉴于鄙人处于比水题还菜的阶段:

我把解释写到了代码里面:

上代码!

#include<iostream>
#include<stack>

using namespace std;

int main() {
	int n,m;
	cin>>n>>m;
	int a1=0,b[n],a2=0;
	stack<int>c,d;
//
	for(int i=0; i<n; i++)
		cin>>b[i];
	bool flag=1;
//	分析:1.栈满了就GG;
//		  2.入栈条件;
//		  3.出栈条件:
//	a1、a2用来控制压入栈的数字
//
//	控制好跳出的条件;
//	其实这个题是有规律的:因为原来的火车顺序是一定的;想按照规定的顺序输出
//	入栈条件:当栈内元素没有满的时候且栈顶元素小于应该输出顺序时入栈;
//	出栈条件:只需考虑栈顶元素与既定元素相同就出栈;
//	每次有元素入栈就应该判断是否出栈;
	for(int i=0; i<n; i++) {
		while(c.empty()==true||c.top()<b[i])
			c.push(++a1);//小心运算符优先级;
		if(c.size()>m||c.top()>b[i]) {//越界里一个flag;
			flag=0;
		}
		if(c.top()==b[i]) {
			c.pop();
		}
		if(flag==0) break;
	}
//	栈满了就GG了;
	if(flag==0) {
		cout<<"震惊!昨天小汤河火车站竟然。。。"<<endl;
//
	} else
//	排除了不成立的情况,剩下的都会成立;

		for(int i=0; i<n; i++) {
			while(d.empty()==true||d.top()<b[i]) {
				d.push(++a2);
				cout<<"push"<<endl;
			}
			if(d.top()==b[i]) {
				d.pop();
				cout<<"pop"<<endl;
			}
		}
	return 0;
}

如有错误敬请指教。

Thanks♪(・ω・)ノ(*^▽^*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油当当

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值