POJ 1363 栈

来源:互联网 发布:windows桌面便签 编辑:程序博客网 时间:2024/05/16 04:55

poj 1363 经典的火车进站

火车进站顺序为1,2,3.....n,给你n和一个长度为n的出站序列,问是否合法..

如果n是0结束程序,如果出站序列第一个是0要换n..

思路:数组模拟栈操作,对于当前出站的元素(开始为第一个),

_1如果是栈顶,出栈

_2如果是当前入栈元素,直接出栈

_3都不是如果还有未入栈元素,入栈

_4没有未入栈元素,序列不合法.

#include<stdio.h>int in[1005];                 //入栈序列int out[1005];                //出栈序列int str[1005];                 //模拟栈int main(){    int n,x,i;    while(scanf("%d",&n)!=EOF){        int tp=0;                   //换n标志        if(n==0)break;          //结束标志        while(1){        for(i=1;i<=n;i++){            scanf("%d",&out[i]);            if(out[1]==0){                printf("\n");                tp=1;break;            }        }        if(tp==1)break;        for(i=1;i<=n;i++)in[i]=i;        int intot=1,outtot=1,strtot=0,flag=0;                     str[0]=-1;                                                 while(1){           if(str[strtot]==out[outtot]){               strtot--,outtot++;       //当前出栈元素是栈顶元素           }else if(in[intot]==out[outtot]&&intot<n+1){ //当前出栈元素是入栈元素               intot++,outtot++;           }else if(intot<n+1){      //仍有未入栈元素,               str[++strtot]=in[intot++];           }else{            if(outtot==n+1){        //出栈元素全部出栈完毕               flag=1;           }            break;           }        }        if(flag)printf("Yes\n");        else printf("No\n");        }    }    return 0;}