1. 程式人生 > >常用資料結構總結(基於C++)

常用資料結構總結(基於C++)

棧(stack)

簡介

棧是一種只能在一端進行插入或者刪除操作的線性表。其中允許進行插入或者刪除操作的一端稱為棧頂。棧的插入和刪除一般叫入棧和出棧。棧的順序儲存結構叫做順序棧,棧的鏈式儲存結構叫做鏈棧

C++中棧的標頭檔案為<stack>

宣告

stack<資料型別> 物件;

例如:stack<int> s;

基本操作

  1. push(): 向棧內壓入一個成員;
  2. pop(): 從棧頂彈出一個成員(在棧中將其刪除),此函式不返回任何值;
  3. top(): 返回棧頂,但不刪除成員;
  4. empty(): 如果棧為空返回true,否則返回false;
  5. 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;

基本操作

  1. push(): 向隊尾壓入一個成員;
  2. pop(): 將隊頭元素彈出,此函式不返回任何值;
  3. front(): 返回對頭元素,但不刪除成員;
  4. back() 返回隊尾元素,但不刪除成員;
  5. empty(): 如果佇列為空返回true,否則返回false;
  6. 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;
}

 執行結果

二叉搜尋樹

簡介

搜尋樹是一種可以進行插入,搜尋,刪除等操作的資料結構,可以用作字典或優先順序佇列。二叉搜尋樹是最簡單的搜尋樹。其左子樹的鍵值<=根節點的鍵值,右子樹的鍵值>=根節點的鍵值。

基本概念

  1. 父節點與子節點(parent and child):由一個結點可以引出的一個或兩個結點,該結點稱為其所引出節點的父節點,被引出的節點稱為父節點的子節點
  2. 根(root):唯一沒有父節點的節點
  3. 葉節點(leaf):沒有子節點的節點
  4. 內部節點(internal node):除葉節點以外的節點
  5. 度(degree):節點的子節點數
  6. 深度(depth):從該節點到某一節點的路勁長度稱為該節點的深度
  7. 高(height):某一節點到葉節點的最長路徑長度稱為該節點的高
  8. 樹高:根節點的高度

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;
}

執行結果