Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24980 Accepted Submission(s): 9424
#include<stdio.h> #include<string.h> #include<stack> #define MAX 1100 using namespace std; int main() { int n,m,j,i,t,k; char jin[MAX],chu[MAX];//进展顺序和出站顺序数组 int vis[MAX];//记录第i次是进站还是出站 while(scanf("%d",&t)!=EOF) { scanf("%s %s",jin,chu); stack<char>s;//定义一个字符型的栈 memset(vis,0,sizeof(vis)); for(i=0,j=0,k=0;i<t;i++) { s.push(jin[i]); vis[k++]=1; while(!s.empty()&&s.top()==chu[j])//如果站不为空且栈顶的元素与出站顺序的元素相同 { j++;//删除已出的元素 vis[k++]=0;//出站并标记 s.pop();//删除栈首元素 } } if(s.empty()) { printf("Yes.\n"); for(i=0;i<k;i++) { if(vis[i]) printf("in\n"); else printf("out\n"); } } else printf("No.\n"); printf("FINISH\n"); } return 0; }
用数组实现:
#include<stdio.h> #include<string.h> #define MAX 1100 char zhan[MAX]; char jin[MAX],chu[MAX];//进展顺序和出站顺序数组 int vis[MAX];//记录第i次是进站还是出站 int main() { int n,m,j,i,s,sum,t,top,k; while(scanf("%d",&t)!=EOF) { scanf("%s %s",jin,chu); memset(vis,0,sizeof(vis)); top=0;k=0; for(i=0,j=0,k=0;i<t;i++) { zhan[top++]=jin[i];//存栈 vis[j++]=1; while(top>=0&&zhan[top-1]==chu[k])//如果站不为空且栈顶的元素与出站顺序的元素相同 { vis[j++]=0;//出站并标记 top--;//删除栈首元素 k++;//删除已出的元素 } } if(top<0) { printf("Yes.\n"); for(i=0;i<j-1;i++) { if(vis[i]) printf("in\n"); else printf("out\n"); } } else printf("No.\n"); printf("FINISH\n"); } return 0; }