HDU 1022 Train Problem I 附详细思路

// HDU 1022 Train Problem I 附详细思路
// 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1022
// 栈其实就是高级的指针加数组…
// 这道题其实所有的数组都可以写成栈,但刚学不久不敢大意
// 题目说的意思就是模拟栈的过程,判断一组数能否在出入栈之后变成另一组数
// 解题的关键是每次入栈之后判断while(s.top()== *out_begin),想一想,如果成立就得出栈了^-^
// 源代码都有注释,看看就会了
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
 int n;
 int i,j;
 char m1[20],m2[20];
 int in_num[20],out_num[20];
 int *in_begin,*in_end,*out_begin,out_end;
 while(scanf("%d %s %s",&n,m1,m2)!=EOF)
 {
  for( i=0;i<n;i++ )                                    //以字符串输入,以整形数组处理
  {
   in_num[i]=m1[i]-'0';
   out_num[i]=m2[i]-'0';
  }
  in_begin=in_num; in_end=in_num+n-1;
  out_begin=out_num;
  stack<int> s;
  i=-1;
  int in_or_out[40]={0,};                         //"in"==1 "out"==2
  while(in_begin <= in_end)                     //当in进栈过程
  {
   s.push(*in_begin) ;
   i++;
   in_or_out[i]=1;                                     //"in"
   while(s.top()== *out_begin)                //栈顶是*out_begin的话表示该出栈了  /*关键步骤*/
   {  
    s.pop();
    out_begin++;                                     //移到可以出的那一个
    i++;                                                    //步骤数+1
    in_or_out[i]=2;                                  //"out"
    if(s.empty())  
     break;
   }
   in_begin++;                                       //向后移一位
  }
  if(s.empty())                                        //栈里没有出不去的数就是所有in的都out了
  {
   printf("Yes./n");
   for(j=0;j<=i;j++)                                //i是步骤数目
   {
    if(in_or_out[j]==1)
     printf("in/n");
    if(in_or_out[j]==2)
     printf("out/n");
   }
  }
  else                                                    //栈里还有出去不了的数
  {
   printf("No./n");
  }
  printf("FINISH/n");                            //终于看到FINISH了。。
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值