常用資料結構總結(基於C++)
阿新 • • 發佈:2018-12-09
棧(stack)
簡介
棧是一種只能在一端進行插入或者刪除操作的線性表。其中允許進行插入或者刪除操作的一端稱為棧頂。棧的插入和刪除一般叫入棧和出棧。棧的順序儲存結構叫做順序棧,棧的鏈式儲存結構叫做鏈棧。
C++中棧的標頭檔案為<stack>
宣告
stack<資料型別> 物件;
例如:stack<int> s;
基本操作
- push(): 向棧內壓入一個成員;
- pop(): 從棧頂彈出一個成員(在棧中將其刪除),此函式不返回任何值;
- top(): 返回棧頂,但不刪除成員;
- empty(): 如果棧為空返回true,否則返回false;
- size(): 返回棧內元素的大小;
注:棧只能對棧頂元素進行操作。
程式碼示例
#include<iostream> #include<stack> using namespace std; int main(){ // 建立一個棧 stack<int> s; cout<<"棧的長度為:"<<s.size()<<endl; cout<<"入棧"<<endl; for(int i=0;i<10;i++){ // 將元素壓入棧 s.push(i); cout<<s.top()<<endl; } cout<<"棧的長度為:"<<s.size()<<endl; cout<<"出棧:"<<endl; // 判空 while(!s.empty()){ // 取棧頂元素 cout<<s.top()<<endl; // 彈出棧頂元素 s.pop(); } cout<<"棧的長度為:"<<s.size()<<endl; return 0; }
執行結果:
佇列(queue)
簡介
佇列也是一個線性儲存表,元素資料的插入在表的一端進行,在另一端刪除,從而構成了一個先進先出FIFO(First In First Out)表。允許進行插入的一端稱為隊尾,執行刪除的一端稱為隊頭。佇列的順序實現稱為順序佇列,連結實現稱為連結佇列。
C++中佇列的標頭檔案為<queue>
宣告
queue<資料型別> 物件;
例如:queue<int> q;
基本操作
- push(): 向隊尾壓入一個成員;
- pop(): 將隊頭元素彈出,此函式不返回任何值;
- front(): 返回對頭元素,但不刪除成員;
- back() 返回隊尾元素,但不刪除成員;
- empty(): 如果佇列為空返回true,否則返回false;
- size(): 返回佇列長度;
注:佇列只能移除隊首元素,但可返回隊首元素或者隊尾元素
程式碼示例
#include<iostream>
#include<queue>
using namespace std;
int main(){
// 定義一個佇列
queue<char> q;
char str[20] = "helloWorld";
cout<<"佇列的長度為"<<q.size()<<"\n"<<endl;
cout<<"入隊"<<endl;
for(int i=0;i<10;i++){
// 將新元素壓入佇列
q.push(str[i]);
cout<<"queue's back is "<<q.back()<<endl;
}
cout<<"佇列的長度為"<<q.size()<<endl;
cout<<"\n出隊"<<endl;
// 判空
while(!q.empty()){
cout<<"queue's front is "<<q.front()<<endl;
// 將對頭彈出
q.pop();
}
cout<<"佇列的長度為"<<q.size()<<endl;
}
執行結果
二叉搜尋樹
簡介
搜尋樹是一種可以進行插入,搜尋,刪除等操作的資料結構,可以用作字典或優先順序佇列。二叉搜尋樹是最簡單的搜尋樹。其左子樹的鍵值<=根節點的鍵值,右子樹的鍵值>=根節點的鍵值。
基本概念
- 父節點與子節點(parent and child):由一個結點可以引出的一個或兩個結點,該結點稱為其所引出節點的父節點,被引出的節點稱為父節點的子節點
- 根(root):唯一沒有父節點的節點
- 葉節點(leaf):沒有子節點的節點
- 內部節點(internal node):除葉節點以外的節點
- 度(degree):節點的子節點數
- 深度(depth):從該節點到某一節點的路勁長度稱為該節點的深度
- 高(height):某一節點到葉節點的最長路徑長度稱為該節點的高
- 樹高:根節點的高度
C++的STL中基於二叉搜尋樹有資料結構set和map
1.set
set是根據元素值進行排序的集合,所以插入的元素在集合中具有唯一性。
常用操作
begin() | 返回指向第一個元素的迭代器 |
end() | 返回指向最後一個元素的迭代器 |
clear() | 清除所有元素 |
insert() | 在集合中插入元素 |
erase() | 刪除集合中的元素 |
find() | 返回一個指向被查詢到元素的迭代器 |
empty() | 如果集合為空,返回true |
max_size() | 返回集合能容納的元素的最大限值 |
size() | 集合中元素的數目 |
lower_bound() | 返回指向大於(或等於)某值的第一個元素的迭代器 |
upper_bound() | 返回大於某個值元素的迭代器 |
程式碼示例
#include<iostream>
#include<set>
using namespace std;
void print(set<int> s){
// 輸出集合中元素的數目
cout<<"size:"<<s.size()<<endl<<"元素:";
// 使用迭代器遍歷集合
for(set<int>::iterator it = s.begin();it!=s.end();it++){
cout<<" "<<(*it);
}
cout<<endl;
}
int main(){
// 宣告一個set型別
set<int> s;
// 插入值
s.insert(8);
s.insert(3);
// 注意,重複插入的值會被忽視
s.insert(3);
s.insert(7);
s.insert(1);
// 輸出當前set
print(s);
// 刪除指定值
s.erase(7);
print(s);
// 查詢元素
if(s.find(1) == s.begin())
cout<<"\nfind it"<<endl;
// 清空集合
s.clear();
print(s);
return 0;
}
執行結果
2.map
map以鍵值對為元素,集合以鍵作為排序標準。集合中的鍵具有唯一性。
宣告
map<string, string> mapStudent;
常用操作
clear() | 清除 map 中所有元素; |
erase() | 刪除 map 中指定位置的元素; |
insert() | 在 map 指定位置新增 pair 型別的元素; |
find() | 獲取 map 中元素的迭代器 |
begin(), end() | map 的正向迭代器的起始位置與終點位置; |
程式碼示例
#include<iostream>
#include<map>
#include<string>
using namespace std;
void print(map<string,int> T){
// 宣告map的一個迭代器
map<string, int>::iterator it;
// 輸出map的size
cout<<T.size()<<endl;
// 使用迭代器遍歷map
for(it = T.begin();it!=T.end();it++){
// 注意,要通過pair才能遍歷值
pair<string,int> item = *it;
cout<<item.first<<"-->"<<item.second<<endl;
}
cout<<endl;
}
int main(){
// 宣告一個map集合
map<string, int> T;
// 加入鍵值對
T["red"] = 32;
T["blue"] = 688;
T["yellow"] = 122;
// 對特定鍵對應的值進行操作
T["blue"] += 312;
print(T);
// 通過pair的方法加入鍵值對
T.insert(make_pair("zebra",101010));
T.insert(make_pair("white",0));
print(T);
// 刪除鍵值對
T.erase("yellow");
print(T);
// 輸出指定的鍵值對
pair<string,int> target = *T.find("red");
cout<<target.first<<"-->"<<target.second<<endl;
return 0;
}
執行結果