基礎資料結構

基本概念

Queue

簡單的說,Queue是個操作陣列的方式,也就是利用兩個變數: head及tail,每次從head取得內容,從tail增加內容。

#include<stdio.h>
main(){
  int queue[10]={1, 2, 3, 4, 5};
  int head = 0;
  int tail = 4;
  **tail ++;
  queue[tail] = 6;//push to the tail**
  for (int i = head; i <= tail ; i ++){
    printf("%d ",queue[i]);
  }
  printf("\\n");
  **int a = queue[head]; //pop from the head
  head ++;**
  for (int i = head; i <= tail ; i ++){
    printf("%d ",queue[i]);
  }
  printf("\\n");

}

可以利用c++內建的queue

#include <iostream>
#include <queue>
using namespace std;

int main(){
    queue<int> q;   // 一個空的 queue
    q.push(10);
    q.push(20);
    q.push(30);
    q.push(40);
    q.push(50);     // [10, 20, 30, 40, 50]

    cout << q.front() << endl;  // 10
    cout << q.back() << endl;   // 50

    q.pop();    // pop from the front
    q.push(60); // push to the back
    cout << q.front() << endl;  // 20
    cout << q.back() << endl;   // 60

}

Stack

簡單的說,Stack也是個操作陣列的方式,但只利用一個變數: top(其實就是tail),每次只從top取得內容,只從top增加內容。

#include<stdio.h>
main(){
  int stack[10]={1, 2, 3, 4, 5};
  int top = 4;

  **top ++;
  stack[top] = 6;//push to the top**
  for (int i = 0; i <= top ; i ++){
    printf("%d ",stack[i]);
  }
  printf("\\n");
  **int a = stack[top]; //pop from the head
  top --;**
  for (int i = 0; i <= top ; i ++){
    printf("%d ",stack[i]);
  }
  printf("\\n");

}

可以利用c++內建的stack

#include <iostream>
#include <stack>
using namespace std;

int main(){
    stack<int> s;   // 一個空的 stack
    s.push(10);
    s.push(20);
    s.push(30);
    s.push(40);
    s.push(50);     // [10, 20, 30, 40, 50]

    cout << s.top() << endl;   // 50

    s.pop();    // pop from the front
    s.push(60); // push to the back
    cout << s.top() << endl;  // 60

}

Tree

Tree在資料結構中是相當重要的概念,現在的資料量都非常龐大,基本上就利用Tree來加速資料的搜尋。在c++裡並沒有內建的Tree,APCS考試雖然會用到Tree的概念,但是,可以不必真的建Tree,而是要懂得Tree的運作原理。

Vector

當題目提到資料量無特定上限時,一般的陣列可能就會有問題,這時候vector就可以派上用場了。可以將資料利用push_back()放到最後,可以利用size(),知道目前有幾筆。也可以像陣列一樣直接取得某一筆資料。

#include <iostream>
#include <vector>
using namespace std;
main(){
  vector<int> v;
  v.push_back(500);
  v.push_back(300);
  v.push_back(700);
  for (int i = 0; i< v.size(); i++){
    cout << v[i] <<endl;
  }

}