HDU1022 Train Problem I

解题思路:
       本题是栈的应用问题,主要是对进栈、出栈进行模拟。输入一个进栈序列记为  in  和出栈序列  out  。设置两个变量 i  、 j 和一个堆栈S,栈中存放的是题目输入的入栈序列,初始时 i 指向out字符串首字符,j 指向in字符串首字符,接着对 i 和 j 进行遍历。遍历过程中有如下几种情况:
              1、i  和  j  所指的字符相同,说明此时轮到对该节车厢进行操作,即先将其入栈然后出栈。
              2、i  和  j  所指的字符不相同,又分两种情况。如果栈非空且栈顶元素和现在出栈序列  j  所指字符相同,那就将栈顶元素出栈。如若不是执行进栈操作。
       最后如果栈中仍有元素不能出战的,那就说明从入栈序列到出栈序列是行不通的。

举个栗子:
input:

4 1234 3241

过程应该是:1、2、3依次进栈,然后3、2依次出栈,4进栈然后出栈,最后1进栈然后出栈。最后栈中没有任何元素。

以下给出代码:

#include <bits/stdc++.h>
using namespace std;
stack<char> s;
int n;
char op[100];       //保存进栈、出栈操作序列
bool f;            
void init(){
	f=true;
	while(!s.empty())
		s.pop();
	memset(op,'\0',sizeof(op));
}

int main(){
	while(~scanf("%d",&n)){
		string in,out;
		cin>>in>>out;                  //输入两个序列
		int num=0,i,j;
		init();                       //初始化操作
		for(i=0;i<out.length();){
			for(j=0;j<in.length();){
				if(out[i]!=in[j]){                     //i、j所指字符不相同
					if(!s.empty()&&out[i]==s.top()){   //栈非空且栈顶元素和此时出栈序列所指元素相同
						s.pop();
						op[num++]='o';
						i++;
					}else{
						s.push(in[j]);
						op[num++]='i';
						j++;
					}
				}else{            ///i、j所指字符相同
					op[num++]='i';
					op[num++]='o';
					i++;
					j++;
				}
			}
			if(j==in.length())
				break;
		}
		while(!s.empty()){
			if(s.top()==out[i]){
				op[num++]='o';
				s.pop();
				i++;
			}else{
				f=false;
				break;
			}	
		}
		if(f){
			printf("Yes.\n");
			for(j=0;j<num;j++){
				if(op[j]=='i')
					printf("in\n");
				else if(op[j]=='o')
					printf("out\n");
			}
		}else
			printf("No.\n");
		printf("FINISH\n");
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白白白白白8

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

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

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

打赏作者

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

抵扣说明:

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

余额充值