1. 程式人生 > >數據結構 station

數據結構 station

public class col num bool pri 思路 描述 效率

問題描述

  一天,小 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 } 

數據結構 station