杭电ACM1022


题意(题目纯属本人自己理解加网上大神们的先作所描述的,英语水平烂,不能直译,如有错请多多指教,谢谢):火车进站出站的问题,这个站是个终点站,再往前就没路了,所以要出站的话它只能从进站的那头出,因此,多列火车进入后,它们出站的次序正好相反了,如题中所说进站123,出站321。但是,重点来了,火车也可以进来一辆,然后马上出去,第二辆再进来,等等;比如:进站123 ,出站123 或 进站123, 出站213 等等。但是,进站123,出站312  这样就不可行了。。。

思路:栈的应用

             入站条件:(1)判断是否栈是否为空,若为空入栈;(2)若不为空,判断栈顶与出站车次序是否相等,若不相等,入栈;

             出站条件:判断栈顶与出站车次序是否相等,若相等,进入循环,出栈;
             输出用个数组标记入栈为1,出栈为0,然后判断输出即可。

此题也并非自己独立思考出来了,本人开始就理解错题意了,以为就是数字的倒置就完事了。后来从网上看到题意并非其。顺便瞄了几眼先人的代码,自己才搞出来的,(在这里也谢谢那些大神)呵呵。。。


代码:

#include <stdio.h>

#include <stdlib.h>
#define Stack_size 50
typedef struct
{
    char elem[Stack_size];
    int top;
}Seqstack;
//栈的初始化
 void Initstack(Seqstack *S)
 {
     S->top=0;
 }
 //栈的判空
int Isemply(Seqstack S)
 {
     if(S.top==0)
        return 1;
     else
        return 0;
 }
 //进栈
 int Pushstack(Seqstack *S,char x)
 {
     if(S->top==Stack_size-1)
        return 0;
     S->elem[++(S->top)]=x;
     return 1;
 }
 //出栈
 int Popstack(Seqstack *S,char *x)
 {
     if(S->top==0)
        return 0;
     else
     {
         *x=S->elem[S->top--];
         return 1;
     }
 }
 //获取栈顶
 int Gettop(Seqstack *S,char *x)
 {
     if(S->top==0)
        return 0;
     else
        *x=S->elem[S->top];
     return 1;
 }
int main()
{
    char x1[Stack_size],x2[Stack_size],x,y;
    int n,i,j,record[Stack_size],count;
    Seqstack S;
    while(scanf("%d",&n)!=EOF)
    {


        getchar();//吸收空格
        Initstack(&S);
        count=0;j=0;
        for(i=0;i<n;i++)
        {
            scanf("%c",&x1[i]);


        }
        getchar();//吸收空格
        for(i=0;i<n;i++)
        {
            scanf("%c",&x2[i]);
        }
        getchar();//吸收空格
        for(i=0;i<n;i++)//入站条件:(1)判断是否栈是否为空,若为空入栈;
            if(Isemply(S))
            {
                Pushstack(&S,x1[i]);
                record[count++]=1;//标记入栈位置,在输出时使用
                Gettop(&S,&x);
            }
            else
            {


              if(x2[j]!=x)//(2)若不为空,判断栈顶与出站车次序是否相等,若不相等,入栈;
        {
              {
                Pushstack(&S,x1[i]);
                record[count++]=1;//标记入站位置,在输出时使用
              }
              }
              Gettop(&S,&x);
              while(x2[j]==x)//出站条件:判断栈顶与出站车次序是否相等,若相等,进入循环,出栈;
                {
                    Popstack(&S,&y);
                    Gettop(&S,&x);
                    record[count++]=0;//标记出站位置,在输出时使用
                    j++;
                }




            }


        if(Isemply(S))
        {
            printf("Yes.\n");
            for(i=0;i<2*n;i++)//2*n代表输出个数
            {
                if(record[i])//数组中已存好1(in)或者0(out)
                printf("in\n");
                else
                printf("out\n");
            }
            printf("FINISH\n");


        }
        else
        {
            printf("No.\n");
            printf("FINISH\n");
        }
}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值