思路不清楚。以为要把所有的出栈,进栈的可能都列举出来。正确思路:这个是栈的应用,我们用一个栈s来存放列车的入栈序列, 用一个数组flag存放进出站顺序,如果栈顶和O2的队首是相同的,那么执行出站,且O2指向下一个要出站的坐标,flag标记进站,如果不相同,那么肯定是列车继续进站,s进行push就可以了,flag标记出站,最后如果s的元素已经超过了n,说明n个列车都已经进站了,下一个还是进站肯定不正确。
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;
const int SIZE = 101;
char s[SIZE], in[SIZE], out[SIZE];
int flag[SIZE*2 + 10];
int main()
{
int i , j;
int n, top, cnt;
while(~scanf("%d%s%s", &n, in, out))
{
i = 0;
j = 0;
top = -1;
cnt = 0;
memset(flag, 0, sizeof(flag));
while(j < n)
{
if(top == -1 || s[top] != out[j] && i < n)
{
s[++top] = in[i++];
flag[cnt++] = 1;
}
else
{
if(s[top] == out[j])
{
top--;
++j;
flag[cnt++] = 0;
}
else break;
}
}
if(top == -1)
{
printf("Yes.\n");
for(i = 0 ; i < cnt ; i++)
{
if(flag[i]) printf("in\n");
else printf("out\n");
}
}
else
{
printf("No.\n");
}
printf("FINISH\n");
}
}
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;
const int SIZE = 101;
char s[SIZE], in[SIZE], out[SIZE];
int flag[SIZE*2 + 10];
int main()
{
int i , j;
int n, top, cnt;
while(~scanf("%d%s%s", &n, in, out))
{
i = 0;
j = 0;
top = -1;
cnt = 0;
memset(flag, 0, sizeof(flag));
while(j < n)
{
if(top == -1 || s[top] != out[j] && i < n)
{
s[++top] = in[i++];
flag[cnt++] = 1;
}
else
{
if(s[top] == out[j])
{
top--;
++j;
flag[cnt++] = 0;
}
else break;
}
}
if(top == -1)
{
printf("Yes.\n");
for(i = 0 ; i < cnt ; i++)
{
if(flag[i]) printf("in\n");
else printf("out\n");
}
}
else
{
printf("No.\n");
}
printf("FINISH\n");
}
}