HDOJ acm 1022 火车进站出站(栈系列)

9 篇文章 0 订阅

#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main(){
	int n;
	while (cin >> n)
	{
		bool flag = false;
		
		char* pin = new char[5*n];
		char* pout = new char[5*n];
		int* data = new int[5*n];
		int k = 0;
		cin >> pin;
		cin >> pout;		
		stack<char> car;		
		for (int i = 0, j = 0; i <=n;)
		{
			if (  (pin[j] != pout[i]))
			{
				if (!car.empty() && car.top() == pout[i])
				{
					i++;
					data[k++] = 0;
					car.pop();
				}
				else
				{					
					car.push(pin[j]);
					data[k++] = 1;					
					j++;
				}
			}
			else if ((pin[j] == pout[i]))
			{				
				data[k++] = 1;
				data[k++] = 0;
				i++;
				j++;
			}

			if ((i >= n && (j >= n) && (car.empty())))
			{
				flag = true;
				break;

			}
			if ((car.size() >= n) && (pout[i] != car.top())){
				flag = false;
				break;
			}

		}
		if (flag == true)
		{
			cout << "Yes." << endl;
			for (int i = 0; i < 2 * n; i++)
			{
				if (data[i] == 1)
					cout << "in" << endl;
				else
					cout << "out" << endl;
			}
		}
		else
			cout << "No." << endl;
		cout << "FINISH" << endl;
	}
	return 0;
}
/*
解题过程自我总结:
1:明白这不是简单的字符串的逆序,而是栈的运用。
2:思路类似于有两组火车等待出站,一组位于stack中,一组就是数组中还未进站的队列,通过与给定的此刻需要出站的火车进行比较,选择是哪一组的火车需要出站。
3:一开始只是简单地判定能否按给定顺序出站成功,没有in out标记。后来加上int[] data模拟是进站还是出站操作,值得注意的是,
当条件符合数组中还未进站的火车等于此刻需要出站的火车是,逻辑上是没有让这辆火车push to stack,只是把data[i]=1,data[i+1]=1,即设置成进站再出站。
4:以上过程完成后,是运行超时,明白需要把数组增大。接下来是答案错误,意识到没有注意的问题是,当我入站和出站给定的数字有不同时,即输入 1 1 0,会陷入死循环,
于是我加上了最后的一个if判断,思路即堆栈达到火车数量后,并且栈顶元素仍旧不符合给定的出站火车,那么退出循环,flag=false。
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值