初級資料結構

月光遲暮發表於2020-11-01

參考《挑戰程式設計競賽2》

初級資料結構包括棧(stack)、佇列(queue)、表(list)

棧中最重要的是指向棧頂的指標top

// S[1000]是棧,top是指向棧頂的指標
int top,S[1000];
// push入棧
void push(int x){
    S[++top] = x;
}
// pop出棧
int pop(){
    return s[top--];
}

佇列

佇列中最重要的是指向隊頭的指標head和隊尾的指標tail

// 結構體定義形式要記住
typedef struct pp{
    char name[100];
    int t;
}P;

// Q[LEN]為佇列
P Q[LEN];
// head,tail分別為頭指標和尾指標,n為佇列長度
// tail指向最後一個元素的後一位,head指向第一個元素
int head,tail,n;

void enqueue(){
    Q[tail] = x;
    tail = (tail + 1) % LEN;
}
P dequeue(){
    P x = Q[head];
    head = (head + 1)%LEN;
    return x;
}

連結串列

其實畫圖明瞭之後就很容易寫出來

//雙向連結串列,prev指向前一個元素,next指向下一個元素
typedef struct Node{
    int key;
    Node *prev, *next;
}Node;
// nil是指向頭結點的指標
// 頭結點不包含任何資料
Node *nil;

void init(){
    nil = (Node*)malloc(sizeof(Node));
    nil->next = nil;
    nil->prev = nil;
}
void insertNode(int key){
    Node *x = (Node*)malloc(sizeof(Node));
    x->key = key;
    // 在頭節點後新增元素
    x->next = nil->next;
    nil->next->prev = x;
    nil->next = x;
    x->prev = nil;
}
Node* listSearch(int key){
    Node *cur = nil->next;
    // cur==nil的時候,搜尋完畢了
    while( cur!= nil&&cur->key != key){
        cur = cur->next;
    }
    return cur;
}
void deleteNode(Node *t){
    if(t == nil) return; //t為頭結點時不做處理
    t->prev->next = t->next;
    t->next->prev = t->prev;
    free(t);
}
void deleteFirst(){
    deleteNode(nil->next);
}
void deletLast(){
    deleteNode(nil->prev);
}
void deleteKey(int key){
    deleteNode(listSearch(key));
}

C++標準庫STL

stack、queue、vector、list
vector是動態陣列
在訪問vector中的元素(賦值或寫入)時,可以與陣列一樣使用"[ ]“運算子
list既可以像vector一樣通過”[ ]"運算子直接訪問特定元素,也可以用迭代器訪問;
list還具備一項vector所不具備的特長,就是元素的插入與刪除操作,只需要O(1)即可完成,效率極高;

stack<int>S;
vector<int> V;
list<pair<int,int>> L;
//使用迭代器如下所示
list<int>::iterator it = L.begin();

其他可直接參考C/C++ API
在這裡插入圖片描述
通過下面的應用可以瞭解stack,pair,make_pair的用法

#include <iostream>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    stack<int> S1;
    // C++中使用pair來表示結構化的一組值
    stack<pair<int,int>> S2;
    char ch;
    int sum = 0;
    for(int i = 0; cin >> ch;i++){
        if(ch =='\\'){
            S1.push(i);
        }
        else if(ch == '/' && S2.size() > 0){
            int j = S1.top();
            S1.pop();
            sum += i - j;
            int a = i - j;
            while(S2.size() > 0 && S2.top().first > j){
                a += S2.top().second;
                S2.pop();
            }
            S2.push(make_pair(j,a));
        }
    }
    vector<int> ans;
    while(S2.size() > 0){
        ans.push_back(S2.top().second);
        S2.pop();
    }
    reverse(ans.begin(),ans.end());
    cout << sum << endl;
    cout << ans.size();
    for(int i = 0;i < ans.size();i++){
        cout << " ";
        cout << ans[i];
    }
    cout << endl;
    return 0;
}

相關文章