POJ 1363 Rails 解题报告

POJ 1363 Rails 解题报告

题目的意思是给出一组数,问你是不是一组合法的出栈序列。
我有两个思路:
1、每个已出栈之后的数且小于此数的数都必须按降序排列。复杂度O(n^2)
2、另一个思路就是直接模拟入栈出栈过程。虽然模拟毫无技巧可言,但复杂度O(n),优于算法1。
 1
 2#include <cstdio>
 3
 4int stack[1005]; //
 5int stack_len; //栈顶位置
 6
 7int main()
 8{
 9    int n;
10    while ( scanf( "%d"&n ), n != 0 )
11    {
12          int tmp;
13          int last;
14          while ( scanf( "%d"&tmp ) )
15          {
16                int max = 0;//初始化部分
17                int flag = 1;
18              stack_len = 0;
19              last = 1;
20              
21              if ( tmp == 0 )   {putchar('\n'); flag = -1;break;}//如果是0结束此case
22              while ( last < tmp ) stack[stack_len++= last++;//入栈
23              max = last;
24              
25              for ( int i = 1; i < n; ++i )
26              {
27                    scanf( "%d"&tmp );
28                    if ( flag ) //前提是合理则判断,若已不合理只读如数据,不进行判断
29                    {
30                      if ( stack_len != 0 && stack[stack_len-1== tmp ) //如果栈非空且下一个该出栈的数字与读入数字相同,则出栈
31                      {
32                           --stack_len;
33                           last = tmp;
34                           max>?=last;
35                      }

36                      else if ( tmp > last ) //如果读如的数字比已出栈的最大数字还大,则将读入数字之前的数字全部入栈,此数字作为出栈数字
37                      {
38                           for ( int i = max+1; i < tmp; ++i )
39                           {
40                               stack[stack_len++= i;
41                           }

42                           max = last = tmp;
43                      }

44                      else //如果以上两个条件都不满足,则说明此数列不满足题意
45                      {
46                           flag = 0;
47                      }

48                    }
 
49              }

50              printf( "%s\n", (( flag == 1 )?"Yes":"No") );
51          }

52    }

53    return 0;
54}

55
posted @ 2008-07-19 13:48  王婷婷๑→‿ฺ←๑  阅读(2030)  评论(0编辑  收藏  举报