数据结构 station

问题描述

  一天,小 L 突然对列车的进出站问题产生了兴趣,如下图所示:
列车只能从 A 进站,或从 B 出站。
列车从 A 进站,进站顺序为 1, 2, 3, 4, 5
列车从 B 出站,出站顺序为 5, 4, 3, 2, 1
现在,小 L 想知道:
列车从 A 进站,进站顺序为 1~n
列车从 B 出站,给定出站的顺序,判断是否可能按照这个顺序出站

数据输入
  第一行一个正整数 n1<=n<=1000)。
  第二行包含 n 个正整数,为 1~n 的某个排列

数据输出
  若能够按照给定的顺序出站,输出”YES” (没有引号)
  否则,输出” NO” (没有引号)

 

解题思路

  思路一:判断出栈序列中,比本数小的数是否按降序排列

      时间复杂度O(n^2),本题1<=n<=1000,可用

      易写,不易错,效率低

  思路二:使用栈模拟进栈出栈

      时间复杂度O(n)

      易写错,效率高

 

code

  solve 1

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 bool popAble(int *p,int len)
 5 {
 6     int i,j;
 7     for(i=0; i<len-1; i++)
 8     {
 9         int last = p[i];
10         for(j=i+1;j<len;j++)
11         {
12             if(p[j]<p[i])
13             {
14                 if(p[j]<last)
15                     last = p[j];
16                 else
17                     return false;
18             }
19         }
20     }
21     return true;
22 }
23 
24 int main()
25 {
26     int n,i;
27     scanf("%d", &n);
28     int *p = (int *)malloc(sizeof(int)*n);
29     for(i=0; i<n; i++)
30         scanf("%d", p+i);
31     
32     if(popAble(p,n))
33         printf("YES\n");
34     else
35         printf("NO\n");
36     
37     free(p);
38     return 0;
39 } 

  

   solve 2

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define ERROR 0x7fffffff 
 5 #define TYPE int
 6 
 7 class MyStack//std::stack
 8 {
 9 public:
10     MyStack(int _maxsize):maxsize(_maxsize),size(0){arr = (TYPE *)malloc(sizeof(TYPE)*maxsize);}
11     ~MyStack() { free(arr); }
12     bool empty() { return size==0; }
13     TYPE top() { return arr[size-1]; }//每次用top()前应先调用empty(),判断是否为空 
14     void pop() { --size; }//本题掉pop()前都有调top()与empty(),可保证不为空 
15     void push(TYPE num) { arr[size++] = num; }//构造传入maxsize,保证不爆栈 
16 private:
17     int maxsize;
18     int size;
19     TYPE *arr;
20 };
21 
22 
23 
24 int main()
25 {
26     int n,i,j;
27     scanf("%d", &n);
28     int *p = (int *)malloc(sizeof(int)*n);//若想再省空间,此数组可省,但可读性降低 
29     MyStack s(n);
30     
31     
32     for(i=0; i<n; i++)
33         scanf("%d", p+i);
34     
35     for(i=1,j=0;i<=n;)
36     {
37         if(i==p[j])
38         {
39             i++;
40             j++;
41         }
42         else if(!s.empty() && s.top()==p[j])
43         {
44             s.pop();
45             j++;
46         }
47         else
48         {
49             s.push(i);
50             i++;
51         }
52     }
53     
54     while(!s.empty())
55     {
56         if(s.top()==p[j])
57         {
58             j++;
59             s.pop();
60         }
61         else
62         {
63             printf("NO\n");
64             free(p);
65             return 0;
66         }
67     }
68     printf("YES\n");
69     
70     free(p);
71     return 0;
72 } 

 

posted @ 2017-10-07 00:17  cbattle  阅读(310)  评论(0编辑  收藏  举报