分析:
明显是一个栈的问题。利用栈后进先出的特点模拟火车进站出站的过程即可轻松解决。
我的思路是:
用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; }