Rails UVA - 514 - 栈

传送门

思路:题目要求判断给定的出栈顺序是否符合要求。我们可以这样想,例如判断5 4 3 2 1与5 4 3 1 2能否通过1 2 3 4 5得到,先比较第一个数为5,此时栈为空,将1~5的数全部入栈,此时栈顶为5,符合顺序,弹出;再比较第二个数4,此时栈顶为4,弹出。。以此类推,可知5 4 3 2 1为合法序列,而当栈顶元素为2时,序列2的当前元素为1,不匹配,说明5 4 3 1 2不是合法序列。

注意:

①多组输入数据的处理,所有用到的变量都必须初始化。

②看准题目要求,输出Yes和No就别输出YES和NO。

AC Code:

 1 /*
 2 5
 3 1  2  3  4  5
 4 5  4  1  2  3
 5 0
 6 6
 7 6  5  4  3  2  1
 8 0
 9 0
10 */
11 #include<cstdio>
12 #include<cstring>
13 using namespace std;
14 const int sz=10000+100;
15 int sta[sz],q[sz],a,b,top;
16 int main()
17 {
18         
19         int n;
20         while(scanf("%d",&n)&&n)
21         {
22             while(1)
23             {
24                 memset(sta,0,sizeof(sta));
25                 memset(q,0,sizeof(q));
26                 int ok=1,a=1,b=1,top=0;
27                 for(int i=1;i<=n;i++)
28                 {
29                     scanf("%d",&q[i]);
30                     if(q[1]==0) 
31                     {
32                         printf("\n");ok=0;break;
33                     }
34                 }
35                 if(ok==0) break;
36                 while(b<=n)
37                 {
38                     if(a==q[b])
39                     {
40                         a++;b++;
41                     }
42                     else if(top>0&&sta[top]==q[b])
43                     {
44                         top--;b++;
45                     }
46                     else if(a<=n)
47                     sta[++top]=a++;
48                     else 
49                     {
50                         ok=0;break;
51                     }
52                 }
53                 printf("%s\n",ok?"Yes":"No");
54             }    
55         }
56     return 0;
57 }
posted @ 2018-01-08 23:25  dprswdr  阅读(213)  评论(0)    收藏  举报