先說一下 一邊要用到算法的東西一般要加#include<algorithm>頭文件
一、棧和隊列
1 棧 :一種線性表
特點 后進先出
頭文件 #include<stack>
聲明 stack< 類型 > sk(變量); 注意 這里的類型 如果是char只能是單個字符 如果要存字符串要用string
- sk.push(); 向里存 寫在括號里
- sk.pop(); 出棧 把最上面的出棧(即所謂的先進后出 注意 這里的不能賦值給別的變量 括號里也不能寫東西
- data = sk.top(); 取出棧頂的元素賦值給一個變量 (不出棧
- size = sk.size(); 棧里元素的個數
- sk.empty(); 判定棧是否為空
注意 要清空棧 沒有函數 要自己寫
2 隊列
特點 先進先出 (類似於排隊買飯
頭文件 #include<queue>
聲明 queue< 類型 > q(變量);
- q.push(); 向里存 寫在括號里
- q.pop(); 出隊列 把隊首的出隊列(即所謂的先進先出 注意 這里的不能賦值給別的變量 括號里也不能寫東西
- data = q.front(); 獲得隊列首的元素賦值給一個變量 (不出隊列
- q.back(); 獲得隊尾的值 同q.front();
- size = q.size(); 隊列里元素的個數
- q.empty(); 判定隊列是否為空
- q.clear(); 清空隊列
3 雙端隊列
特點 兩端都可以進出
頭文件 #include<deque>
聲明 deque< 類型 > dq(變量);
- dq.push_front(); 向雙端隊列首存 寫在括號里
- dq.push_back(); 向雙端隊列尾存 寫在括號里
- dq.pop_front(); 將雙端隊列的隊首元素出雙端隊列
- dq.pop_back(); 將雙端隊列的隊尾元素出雙端隊列
- data = dq.front(); 獲得雙端隊列首的元素賦值給一個變量 (不出雙端隊列
- q.back(); 獲得雙端隊列尾的值 同q.front();
- dq.empty(); 判定雙端隊列是否為空
- dq.clear(); 清空雙端隊列
4 優先隊列(暫時不會。。
特點 自動按升降序排序
頭文件 #include<queue>
priority_queue < 類型 > q; 默認大小排序從大到小
priority_queue < 類型 ,vector <類型>, greater<類型> > q; 默認大小排序從小到大
priority_queue < 類型 ,vector <類型>, less<類型> > q; 默認大小排序 從大到小
- q.push(); 向里存 寫在括號里
- q.pop(); 出隊列 隊首
- data = q.top(); 取出隊首的元素賦值給一個變量 (不出棧
- size = q.size(); 隊列里元素的個數
- q.empty(); 判定隊列是否為空
5 unique( , ) 去重 lower_bound() upper_bound()
6 set
set < 類型 > q; 集合 自帶排序 迭代器
q.insert(); 插入
q.erase(); 插入
q.lower_bound();
迭代器 set < 類型 > :: iterator it;
it = q.begain();
for(it = q.begain() ; it ! = q.end() ; it++)
*it
兩個查詢
it=q.find(); 返回迭代器
q.count(); 返回0或1
運算符重載
6 map
map< 類型,類型 > m; 相當於將離散的數連續的排列在一個數組中 map< , >::iterator it; (*it).first;是鍵 (*it).second; 是值;
鍵 值
查找 m.find();
m.count();
注意 if(m[6]!=0) 是可以的 但是 這樣寫如果沒有會往m里存 可能會將原來的數給壓下去
map可以是好幾個鍵對應一個值
對於遍歷 正着遍歷(從小到大) for(it=m.begin();it!=m.end();it++)
反着遍歷(從大到小) for(it=m.rbegin();it!=m.rend();it++)
這里的it無論正反好像只支持++, - -的操作不支持+1,-1這樣的操作
7 pair 可以重