HDU1022,Train Problem I(栈)

博客围绕栈模拟问题展开,指出突破口是找栈顶,解析将在代码中体现。通过具体例子,如 4 1342 3142,详细阐述了栈的入栈、出栈操作过程,最终根据循环结束时栈是否为空判断是否满足要求并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

明显要用栈来模拟。
突破口:找栈顶
解析将在代码中体现。

#include<stack>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
stack<char> p;
vector<string> v;
char s1[15],s2[15];	//s1存储入栈顺序,s2存储出栈顺序

void print()
{
	string t1="in",t2="out";
	int len1=strlen(s1),len2=strlen(s2);
	int i=0,j=0;	//设置两个游标,i为s1的游标,指向s1对应元素,j为s2游标
	while(i<len1)	
	{
		p.push(s1[i++]);	//入栈
		v.push_back(t1);
		char c=p.top();
		while(j<len2&&c==s2[j])	//判断入栈的元素是否为栈顶
		{
			p.pop();	//是的话,就吐出这个元素
			v.push_back(t2);
			j++;	//游标j指向s2下一个元素
			if(p.empty())	break;	//如果栈已经空了,就可以结束了
			else c=p.top();	//否则继续取当前的栈顶,进行下一轮判断
		}
	}//cout<<v.size()<<endl;
	if(!p.empty())	//如果栈不为空,说明还有元素没有出栈,也就是还有火车没有出站,输出No.
		cout<<"No."<<endl<<"FINISH"<<endl;
	else		//否则,说明火车可以按特定顺序出站
	{
		cout<<"Yes."<<endl;
		for(vector<string>::iterator it=v.begin();it!=v.end();++it)
			cout<<*it<<endl;
		cout<<"FINISH"<<endl;
	}
}

int main()
{
	int n;
	while(cin>>n>>s1>>s2)
	{
		print();
		v.clear();	//vector还有栈都要记得清空
		while(!p.empty())	p.pop();
	}
	return 0;
}

可以用个例子来说明一下:
4 1342 3142
初始i=0,j=0;
1、s1[0]入栈,p(1),i++,栈顶c=1,由于c!=s2[0],不进入内层循环,继续外层循环
2、s1[1]入栈,p(1,3),i++,栈顶c=3,由于c=s2[0],进入内层循坏:
p.pop() --> p(1), j++,c=1;
c=s2[j] --> p.pop(), p(), j++, 栈为空,结束。
3、s1[2]入栈,p(4),i++,栈顶c=4,由于c=s2[2],进入内层循环:
p.pop() --> p(), j++, 栈为空,结束。
4、s1[3]入栈,p(2),i++,栈顶c=1,由于c=s2[3],进入内层循环:
p.pop() --> p(), j++, 栈为空,结束。
5、i>=len1,结束

循环结束,栈p为空,说明能满足要求,按题目要求输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值