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 }

浙公网安备 33010602011771号