杭电1022

虽然说是一道水题但是,却花费了我不少的时间,之所这样有两个原因:

一、题目是英文的,看不太懂,就可能对题意理解不清楚,其实这道题应该很快可以解出来的,但是我没有理解,他让打印出如何进出站,这个要求。所以.......

二、对栈这个概念理解的不够深入。

不说了伤心:粘贴代码;里面有注释,希望能够让和我一样悲催的同志,得到点启发。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int num_train;
    char *in,*out,*Stack;//in是火车进站记录的顺序,out是出栈记录的顺序,Stack保存当比较不匹配时的记录
    int mark[1024];//记录进出站--“in” or  “out”
    int i,j,top,tag,k;//tag是标记:是否符合出栈的规则
    while(scanf("%d",&num_train)!=EOF && num_train)
    {
        in=(char*)malloc(sizeof(char)*num_train);
        out=(char*)malloc(sizeof(char)*num_train);
        Stack=(char*)malloc(sizeof(char)*num_train);

        top=0;
        tag=0;
        scanf("%s",in);
        scanf("%s",out);
        //i是in的索引,j是out的索引,k是mark的索引
        j=0;k=0;
        for(i=0;i<num_train;i++)
        {
            if(in[i]==out[j])
            {
                mark[k++]=0;//先入栈再出栈,此处知识记录火车如何进出站的
                mark[k++]=1;//出栈
                j++;continue;
            }
            else
            {
                if(top!=0)
                {
                   if(Stack[top-1]==out[j])
                    {
                        top--;
                        j++;
                        i--;//防止遗漏,
                        mark[k++]=1;
                    }
                    else
                    {
                        Stack[top++]=in[i];
                        mark[k++]=0;//进站
                    }
                }
                else
                {
                    Stack[top++]=in[i];
                    mark[k++]=0;//进站
                }
            }
        }
        while(top>0 && j<num_train)
        {
            if(Stack[top-1]==out[j])//匹配成功
            {
                top--;
                j++;
                mark[k++]=1;//出栈
            }
            else
            {
                tag=1;//匹配没有成功,设置标记
                break;
            }
        }
        if(!tag)
        {
            printf("Yes.\n");//打印
            for(i=0;i<k;i++)
            {
                if(mark[i]==0)
                {
                    printf("in\n");
                }
                else
                {
                    printf("out\n");
                }
            }
            printf("FINISH\n");
        }

        else
            printf("No.\nFINISH\n");
        free(in);//释放空间
        free(out);
        free(Stack);
    }
    return 0;
}

下面粘贴一个从别处看来的,虽然远离一致,但是实现很简单。粘贴如下,以飨读者!

#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main( )
{
    int N;
    char train1[1002],train2[1002];
    string mark[100];
    while(scanf("%d",&N)!=EOF)
    {
        stack<char> s;
        int i,j=0,k=0;
        scanf("%s %s",train1,train2);
        for(i=0;i<N;i++)//i  train1  k  train2  j  mark
        {
            s.push(train1[i]);
            mark[j++]="in";
            while(!s.empty()&&s.top()==train2[k])
            {
                mark[j++]="out";
                s.pop();
                k++;
            }
        }
        if(s.empty())
        {
           cout<<"Yes."<<endl;
           for(i=0;i<j;i++)
               cout<<mark[i]<<endl;      
           cout<<"FINISH"<<endl;
        }
        else 
        {
            cout<<"No."<<endl;
            cout<<"FINISH"<<endl;
        } 
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值