分析:
明显是一个栈的问题。利用栈后进先出的特点模拟火车进站出站的过程即可轻松解决。
我的思路是:
用2个字符数组保存火车车厢的序列。首先比较出站后(记为s2)数组和出站前 (记为s1)数组的第一个元素,会有以下3种情况:
1、元素相等,则说明这节车厢可以进站后马上出站,直接输出in,out,不需要执行真正的压栈操作。(当然你想压再出一下也行。。不过那是没有任何意义的)
2、元素不相同时,检查栈顶元素是否与s2相同,如果不同,则把s1当前元素压入栈中,输出in,并将s1的字符指针后移一位。
3、元素不相同时,检查栈顶元素是否与s2相同,如果相同,则执行出栈操作,输出out.
如果 s1已经全部压入栈中,而s2后面还有元素没有被比较过,则说明无法按照指定的序列重组火车,输出No
代码:(我写得有点复杂了,其实没这么麻烦的。。不要误导大家了,大家只看上面的思路分析就行 。。)
#include <stdio.h>
#include <string.h>
typedef struct /* »ð³µ¸÷½Ú³µÏáµÄÐòºÅ */
{
char ID[15];
int top;
}TRAIN;
typedef struct /* 为什么是乱码 */
{
char ch[10];
}RESULT;
void to_str(int num,char *res,int len)/* °ÑÊäÈëµÄÕûÊýת»¯Îª×Ö·û´® */
{
int ix;
for(ix = len - 1 ; ix >= 0 ; --ix)
{
res[ix] = num % 10 + 48;
num /= 10;
}
}
int get_digit(int num)/* µÃµ½ÕûÊýµÄλÊý */
{
int res = 0;
while(num)
{
++res;
num /= 10;
}
return res;
}
int main(int argc, char *argv[])
{
TRAIN tn;
RESULT res[20];
tn.top = 0;
char t1[10],t2[10];
int len,before,after,len1,len2,i,j,len_res;
while(scanf("%d%d%d",&len,&before,&after) != EOF)
{
/* ³õʹ»¯ */
len1 = get_digit(before);
len2 = get_digit(after);
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
to_str(before,t1,len1);
to_str(after,t2,len2);
len_res = 0;
memset(res,0,sizeof(res));
memset(&tn,0,sizeof(TRAIN));
for(i = 0,j = 0 ; i <= len2 ; ++i)
{
if(j > len2 - 1 && i > len2 - 1) /* ³É¹¦ */
{
strcpy(res[len_res++].ch,"Yes.");/* ÒòΪҪÏÈÅжÏÄÜ·ñ³É¹¦£¬ËùÒÔÒª°ÑÖмä¹ý³ÌµÄ½ø³öÐÅÏ¢±£´æÆðÀ´ */
break;
}
if(t2[i] != '\0' && j > len2 - 1 && t2[i] != tn.ID[tn.top]) /* ʧ°Ü */
{
strcpy(res[len_res++].ch,"NO.");
tn.top = 0;
break;
}
if(t2[i] != t1[j] && tn.ID[tn.top] != t2[i] && t2[i] != '\0')
{
tn.ID[++tn.top] = t1[j];
++j;
--i;
strcpy(res[len_res++].ch,"in");
}
else if(t2[i] != t1[j] && tn.ID[tn.top] == t2[i])
{
tn.top--;
strcpy(res[len_res++].ch,"out");
}
else if(t2[i] == t1[j]) /* ÈëվǰºÍÈëÕ¾ºó¶ÔÓ¦µÄ³µÏáºÅÏàµÈ£¬ÔòÏȽø£¬ÔÙÂíÉϳö */
{
++j;
strcpy(res[len_res++].ch,"in");
strcpy(res[len_res++].ch,"out");
}
}
if(!strcmp(res[len_res - 1].ch,"Yes."))
{
printf("Yes.\n");
for(i = 0 ; i < len_res - 1; ++i)
printf("%s\n",res[i].ch);
printf("FINISH\n");
}
else
printf("No.\nFINISH\n");
}
return 0;
}