常用数据结构总结(基于C++)

目录

栈(stack)

简介

声明

基本操作

代码示例

队列(queue)

简介

声明

基本操作

代码示例

优先队列(priority_queue)

         简介

声明

基本操作

         调整输出次序

二叉搜索树

简介

基本概念

C++的STL中基于二叉搜索树有数据结构set和map

1.set

常用操作

2.map 

声明

常用操作

代码示例


栈(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<5;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] = "hello";
	
	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;
}

 运行结果

优先队列(priority_queue)

简介

所谓优先队列,就是当把数据存入队列时,会自动进行排序,然后取出数值时,会得到最大值(默认,也可通过设置参数来使每次输出最小值).这里的优先队列基于堆结构.

C++中队列的头文件同为<queue>

声明

priority_queue<数据类型> 对象;

例如:priority_queue<int> q;

基本操作

  1. push(): 向队列插入元素;
  2. pop(): 移除堆顶元素,此函数不返回任何值;
  3. top(): 返回对头元素,但不删除成员;
  4. empty(): 如果队列为空返回true,否则返回false;
  5. size(): 返回队列长度;

调整输出次序

priority_queue <int,vector<int>,less<int> > p;     // 数组从大到小排序,默认从大到小排序
 
priority_queue <int,vector<int>,greater<int> > q;  // 从小到大排序

二叉搜索树

简介

搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用作字典或优先级队列。二叉搜索树是最简单的搜索树。其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值。

一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2^(k-1)个叶子节点,至多有2^k-1个节点。

基本概念

  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()返回一个指向被查找到元素的迭代器,如果没找到则返回end()
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;
}

运行结果

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值