常用数据结构总结(基于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;
}

运行结果

猜你喜欢

转载自blog.csdn.net/li_l_il/article/details/84235850