HDU-1022Train Problem I,简单栈模拟;

Train Problem I

                                                                                                                Time Limit: 2000/1000 MS (Java/Others)    

                                                                                                             Memory Limit: 65536/32768 K (Java/Others)
                                                                             

   可能读完题很多人觉得不用栈,关栈什么事,不过如果代码能力强的话的确不用。主要这题题意还是有点不清楚;

   题意:n列火车,串o1是火车进站的先后顺序,串o2是火车出站的先后顺序,注意这只是一个先后次序,并不代表这些火车是一个挨着一个地进(出);题目求如果按o1这种进站次序与o2这种出站次序是否符合实际;

   思路:可以直接c语言模拟栈,也可以直接用栈写,但思路都是一样的;我们发现这个火车站的进出次序十分符合栈的特点,每次出去的都是栈顶元素,要判断是否符合实际既是判断进与出的关系,我们可以进来然后出去,然后再进来再进来再出去,因为出去的先后顺序已经确定了,所以进入就相当于入栈,判断栈顶元素是否等于出去的顺序,是则删除栈顶元素然后要出去的火车变成下一列,如此重复,最后所有火车都进站后判断栈是否为空或者判断指向下一列要出去的火车指针是否等于最后出去的火车(这里叙述有点模糊,没关系看以下代码),是则YES,反之,NO;

   看栈模拟:

#include<bits/stdc++.h>
using namespace std;
char s1[10],s2[10];
int a[20];
int main()
{
    int n,i;
    while(~scanf("%d%s%s",&n,s1,s2))
    {
        memset(a,0,sizeof(a));
        stack<char>q;
        int k=0,k1=0;
        for(i=0; i<n; i++)
        {
            q.push(s1[i]);//进站相当于入栈;
            a[k++]=1;//1表示进;
            while(!q.empty()&&q.top()==s2[k1])
            {
                a[k++]=-1;//-1表示出;
                q.pop();
                k1++;//指向下一列要出去的火车;
            }
        }
        if(k1==n)//如果栈为空或指针刚好指向最后一列出去的火车则符合实际;
        {
            printf("Yes.\n");
            for(i=0; i<k; i++)
                if(a[i]==1)
                    printf("in\n");
                else printf("out\n");
            printf("FINISH\n");
        }
        else printf("No.\nFINISH\n");
    }
    return 0;
}

  看c代码模拟:

#include<bits/stdc++.h>
using namespace std;
char in[10],out[10],s[10];
int a[20];
int main()
{
    int n,i;
    while(~scanf("%d%s%s",&n,in,out))
    {
        memset(a,0,sizeof(a));
        int x1=strlen(in);
        int j=0,k=0,k1=0;
        for(i=0; i<x1; i++)
        {
            s[j]=in[i];//模拟栈相当于入栈;
            a[k++]=1;
            while(j>=0&&s[j]==out[k1])
            {
                j--;//相当于删除了栈顶元素;
                a[k++]=-1;
                k1++;指向下一列要出去的火车;
            }
            j++;
        }
        if(k1==n)
        {
            printf("Yes.\n");
            for(i=0; i<k; i++)
                if(a[i]==1)
                    printf("in\n");
                else printf("out\n");
            printf("FINISH\n");
        }
        else printf("No.\nFINISH\n");
    }
    return 0;
}
感觉题意才是最主要的!!!!


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值