基本資料結構模板

2021-09-26 03:28:35 字數 3854 閱讀 3441

單鏈表

// head儲存煉表頭,e儲存節點的值,ne儲存節點的next指標,idx表示當前用到了哪個節點

int head, e[n], ne[n], idx;

// 初始化

void init()

// 在煉表頭插入乙個數a

void insert(int a)

// 將頭結點刪除,需要保證頭結點存在

void remove()

雙鏈表

// e表示節點的值,l表示節點的左指標,r表示節點的右指標,idx表示當前用到了哪個節點

int e[n], l[n], r[n], idx;

// 初始化

void init()

// 在節點a的右邊插入乙個數x

void insert(int a, int x)

// 刪除節點a

void remove(int a)

// tt表示棧頂

int stk[n], tt = 0;

// 向棧頂插入乙個數

stk[ ++ tt] = x;

// 從棧頂彈出乙個數

tt -- ;

// 棧頂的值

stk[tt];

// 判斷棧是否為空

if (tt > 0)

佇列

// hh 表示隊頭,tt表示隊尾

int q[n], hh = 0, tt = -1;

// 向隊尾插入乙個數

q[ ++ tt] = x;

// 從隊頭彈出乙個數

hh ++ ;

// 隊頭的值

q[hh];

// 判斷佇列是否為空

if (hh <= tt)

單調棧

常見模型:找出每個數左邊離它最近的比它大/小的數

int tt = 0;

for (int i = 1; i <= n; i ++ )

單調佇列

常見模型:找出滑動視窗中的最大值/最小值

int hh = 0, tt = -1;

for (int i = 0; i < n; i ++ )

kmp

求next陣列:

// s是模式串,p是模板串, n是s的長度,m是p的長度

for (int i = 2, j = 0; i <= m; i ++ )

// 匹配

for (int i = 1, j = 0; i <= n; i ++ )

}

trie樹

int son[n][26], cnt[n], idx;

// 0號點既是根節點,又是空節點

// son儲存樹中每個節點的子節點

// cnt儲存以每個節點結尾的單詞數量

// 插入乙個字串

void insert(char *str)

cnt[p] ++ ;

}// 查詢字串出現的次數

int query(char *str)

return cnt[p];

}

並查集

(1)樸素並查集:

int p[n]; //儲存每個點的祖宗節點

// 返回x的祖宗節點

int find(int x)

// 初始化,假定節點編號是1~n

for (int i = 1; i <= n; i ++ ) p[i] = i;

// 合併a和b所在的兩個集合:

p[find(a)] = find(b);

(2)維護size的並查集:

int p[n], size[n];

//p儲存每個點的祖宗節點, size只有祖宗節點的有意義,表示祖宗節點所在集合中的點的數量

// 返回x的祖宗節點

int find(int x)

// 初始化,假定節點編號是1~n

for (int i = 1; i <= n; i ++ )

// 合併a和b所在的兩個集合:

p[find(a)] = find(b);

size[b] += size[a];

(3)維護到祖宗節點距離的並查集:

int p[n], d[n];

//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離

// 返回x的祖宗節點

int find(int x)

return p[x];

}// 初始化,假定節點編號是1~n

for (int i = 1; i <= n; i ++ )

// 合併a和b所在的兩個集合:

p[find(a)] = find(b);

d[find(a)] = distance; // 根據具體問題,初始化find(a)的偏移量

// h[n]儲存堆中的值, h[1]是堆頂,x的左兒子是2x, 右兒子是2x + 1

// ph[k]儲存第k個插入的點在堆中的位置

// hp[k]儲存堆中下標是k的點是第幾個插入的

int h[n], ph[n], hp[n], size;

// 交換兩個點,及其對映關係

void heap_swap(int a, int b)

void down(int u)

}void up(int u)

}// o(n)建堆

for (int i = n / 2; i; i -- ) down(i);

一般雜湊

(1) 拉鍊法

int h[n], e[n], ne[n], idx;

// 向雜湊表中插入乙個數

void insert(int x)

// 在雜湊表中查詢某個數是否存在

bool find(int x)

(2) 開放定址法

int h[n];

// 如果x在雜湊表中,返回x的下標;如果x不在雜湊表中,返回x應該插入的位置

int find(int x)

return t;

}

字串雜湊

核心思想:將字串看成p進製數,p的經驗值是131或13331,取這兩個值的衝突概率低

小技巧:取模的數用2^64,這樣直接用unsigned long long儲存,溢位的結果就是取模的結果

typedef unsigned long long ull;

ull h[n], p[n]; // h[k]儲存字串前k個字母的雜湊值, p[k]儲存 p^k mod 2^64

// 初始化

p[0] = 1;

for (int i = 1; i <= n; i ++ )

// 計算子串 str[l ~ r] 的雜湊值

ull get(int l, int r)

資料結構模板 棧

此部落格是存的是我自己編寫的棧模板,如有錯誤請指出棧是操作受限的線性表,只允許在棧頂進行插入和刪除操作,遵循 後進先出 原則。include include define elemtype int define maxsize 1000 using namespace std 這是順序棧的模板 ty...

資料結構模板 佇列

此部落格是存的是我自己編寫的佇列模板,如有錯誤請指出佇列是操作受限的線性表,只允許在隊頭進行刪除操作,在隊尾進行插入操作,遵循 先進先出 原則。順序隊 存在假溢位問題 include include define elemtype int define maxsize 1000 using name...

資料結構模板合集

線段樹lazy操作模板 區間修改,區間查詢 class segment tree lazy inline void add int p,int v,int t inline void pushdown int p,int l,int r public inline void build tree i...