思路不清楚。以为要把所有的出栈,进栈的可能都列举出来。正确思路:这个是栈的应用,我们用一个栈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, inout))
    {
        i = 0;
        j = 0;
        top = -1;
        cnt = 0;
        memset(flag, 0sizeof(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");
    }
}


 

posted on 2012-07-04 20:27  有间博客  阅读(184)  评论(0编辑  收藏  举报