數據結構 station
阿新 • • 發佈:2017-10-07
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 出站,給定出站的順序,判斷是否可能按照這個順序出站
★數據輸入
第一行一個正整數 n(1<=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 intmain() 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