题意(题目纯属本人自己理解加网上大神们的先作所描述的,英语水平烂,不能直译,如有错请多多指教,谢谢):火车进站出站的问题,这个站是个终点站,再往前就没路了,所以要出站的话它只能从进站的那头出,因此,多列火车进入后,它们出站的次序正好相反了,如题中所说进站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;
}