数据结构算法与解析(STL版含源码)

2023-05-16

文章目录

    • 第1章 线性表
        • 1.1 顺序存储结构
            • 1.1.1 顺序表
            • 1.1.2 vector线性表——STL的顺序存储结构
        • 1.2 链式存储结构
            • 1.2.1 单链表
            • 1.2.2 双向循环链表
            • 1.2.3 list线性表——STL的链式存储结构
        • 1.3 静态链表存储结构
    • 第2章 栈和队列
        • 2.1 栈
            • 2.1.1 栈的顺序存储结构
            • 2.1.2 栈的链式存储结构
            • 2.1.3 stack ——STL的栈结构
        • 2.2 栈的应用与递归
            • 2.2.1 数制转换
            • 2.2.2 表达式求值
            • 2.2.3 汉诺塔问题与递归实现
            • 2.2.4 迷宫问题
            • 2.2.5 皇后问题
            • 2.2.6 马踏棋盘问题
        • 2.3 队列
            • 2.2.1 队列的链式存储结构
            • 2.2.2 队列的顺序存储结构
            • 2.2.3 queue、deque、priority_queue —— STL的队列结构
        • 2.4 队列的应用 —— 排队和排队机的模拟
    • 第3章 字符串和矩阵
        • 3.1 字符串
            • 3.1.1 字符串的按需(堆)存储结构
            • 3.1.2 STL的串结构
            • 3.1.3 字符串的模式匹配算法
        • 3.2 矩阵
            • 3.2.1 多维数组的顺序存储结构
            • 3.2.2 矩阵的压缩存储
    • 第4章 树与二叉树
        • 4.1 字符串
            • 4.1.1 栈的顺序存储结构
    • 第5章 图
        • 4.1 字符串
            • 4.1.1 栈的顺序存储结构
    • 第6章 查找
        • 4.1 字符串
            • 4.1.1 栈的顺序存储结构
    • 第7章 内部排序
    • ==演示课件==
        • 7.1 插入排序
        • 7.2 冒泡排序
        • 7.3 简单选择排序
        • 7.4 希尔排序
        • 7.5 快速排序
        • 7.6 堆排序(不稳定)
        • 7.7 二路归并排序
        • 7.8 基数排序
        • 7.9 STL排序算法的应用
        • 7.10 总结
    • 第8章 外部排序
        • 4.1 字符串
            • 4.1.1 栈的顺序存储结构

#include <iomanip>  //setw()等
#include <queue>   //STL中的队列与优先队列
#include <deque>  //STL中的双端队列
#include <bitset>   //STL中的位集合
#include <algorithm> //STL中的通用算法
#include <ctime>  //clock()等
#include <cstdarg>  //提供宏va_start、va_arg、va_end,用于存取长参数表
#include <assert.h>  //assert宏

C.h 几乎各程序都需要用到的文件包含宏命令和使用名空间

第1章 线性表

线性表:抽象的数据类型。
逻辑结构:除第一个元素外,每个元素都有一个前驱;除最后一个元素外,每个元素都有一个后驱。
物理结构:顺序、单链、双向链。
STL:vector(顺序表)、list(链表)。

1.1 顺序存储结构

特点:易实现随机查找;但插入或删除时操作复杂。
适用于稳定的线性表,例如职工工资表、学生学籍表。

1.1.1 顺序表

头文件:
SqList.h 顺序表的类(SqList类)
Func1-1.h 5个常用的函数
Func1-2.h 定义模板的实参Student及对其的I/O操作

//SqList.h 顺序表的类(SqList类)
SqList(const SqList &L) //拷贝构造函数
SqList& operator=(const SqList &L) //重载赋值运算符
{
  以上俩个函数关键在于:
  1、若成员数据中有指针数据,则需额外申请空间,以创造两个对象。
  2、重载赋值运算符函数需警惕L=L;且需释放原有空间;return *this;}
bool PriorElem(T e, bool(*eq)(T, T), T &pre_e)const //查找第一个与e满足eq()关系的数据,并用pre_e返回其前驱
{
  1、查询表中第一个与e满足eq()关系的数据,并返回其位序。
  2、判断该位序是否合法,是则用pre_e返回其前驱,否则返回false}
bool NextElem(T e, bool(*eq)(T, T), T &next_e)const //查找第一个与e满足eq()关系的数据,并用pre_e返回其前驱
bool ListInsert(int i, T e) //在位置i处插入新数据e。
{
  1、创造两个T型指针,其中一个指向位置i是为q,另一个指向位置末端是为p。
  2for(p依次自减,直到与位置q相等) {p指向的数据依次后移;}
  3、位置q指向的数据更换为e。
}
bool ListDelete(int i, T &e) //删除位置i处的数据,并用e返回。
{
  1、创造两个T型指针,其中一个指向位置i是为q,另一个指向位置末端是为p。
  2、位置q指向的数据赋值给e。
  3for(p依次自减,直到与位置q-1相等) {p指向的数据依次前移;}
}
template<typename T>
void SqList<T>::ListTraverse(void(*visit)(T&))const //类内声明类外定义;函数指针的使用
{函数也可做为另一个的函数参数,但是形参类型需为指针类型,即函数指针。}
friend void MergeList(const SqList<T>&, const SqList<T>&, SqList<T>&);//归并两个有序的顺序表得到新的有序顺序表的算法
{友元函数用于类中,可以访问类中任意成员。
  1、创建五个指针; T *pa, *pa_last, *pb, *pb_last, *pc;//pa系列指向线性表La;pb系列指向线性表Lb;pc系列指向线性表Lc
  2、将pa和pb指的数据按升序依次赋给pc,直到pa=pa_last或者pb=pb_last
  3、判断pa和pb哪一个未指向末端,并将其剩下的值赋给pc指的位置。
}

主程序:
测试一:普通类型
Main1-1.cpp 验证顺序表SqList类的成员函数
测试二:自定义类型
Main1-2.cpp T为用户自定义类型的实例
F1-1.txt 测试文件
测试三:归并算法(友元函数的使用)
Algo1-1.cpp 归并两个有序的顺序表得到新的有序顺序表的算法

1.1.2 vector线性表——STL的顺序存储结构

顺序线性表类(vector)
测试一:基本类型
Algo1-2.cpp STL中vector使用基本数据类型
测试二:自定义类型
Algo1-3.cpp 在STL中vector使用自定义数据类型

//Algo1-2.cpp STL中向量(顺序线性表)的应用
vector<int>::iterator ip;
vector<int>::const_iterator cip; //vector类中的 const_iterator类 数据成员
a.push_back(i); a.insert(ip, 9); a.erase(a.begin()+4); a.clear(); a.size(); a.capacity(); a.empty(); 

sort(a.begin(), a.end()); 
sort(a.begin(), a.end(), greater<int>());//降序排列;仿函数的使用
reverse(a.begin(), a.end());

//Algo1-3.cpp 在STL中vector使用自定义数据类型
bool InputFromFile(ifstream &f, Student &c) //建议使用这种文件输入;而不是下列的重载运算符>>
{
	f>>c.name>>c.score;
	return f.good();
}
ifstream& operator>>(ifstream &f, Student& c)
{
	f>>c.name>>c.score;
	return f;
}
ifstream fin("F1-1.txt");
Student e;
while(!fin.eof()) //没有到文件尾
//while(fin.peek != EOF)
{
	if(InputFromFile(fin, e)) //也可重载运算符>>;然后 fin>>e;
		a.push_back(e);
}
fin.close();

bool cmp(Student a, Student b)
{
	return a.score<=b.score;
}
sort(a.begin(), a.end(), cmp); //排序的第二种方式;按cmp()的定义排序
//sort(vector<T>::iterator ip_begin, vector<T>::iterator ip_end, bool (*func)(T a,T b))
//函数cmp 和 仿函数greater<int>() 返回值类型都是 bool型
//cmp 和 仿函数greater<int>() 都只是名字,没有含参数。

1.2 链式存储结构

特点:插入或删除时操作方便,但不易实现随机查找。
适用于飞机航班的乘客信息表。

1.2.1 单链表

头文件:
LNode.h 单链表结点类型结构体
LinkList.h 单链表的类(LinkList类)

//LinkList.h 单链表的类(LinkList类)
	int LocateElem(T e, bool(*eq)(T, T))const //查找第一个与e满足关系eq()的数据
	{
		1、创建一个指针,指向第一个结点。(该链表带有头节点)
		LNode<T> *p=Head->next;
		2、循环直到找到第一个与e满足关系eq()的数据,或者链表结束
		while(p!=NULL)
	}
	bool PriorElem(T e, bool(*eq)(T, T), T &pre_e)const //返回前驱
	{
 		1、创建两个指针,其中一个指向第一个结点,另一个为q;
 		LNode<T> *q, *p=Head->next;
 		2、直到p指到倒数第二个位置或者满足eq();q指向p的下一个位置。
		while(p!=NULL && p->next!=NULL) {q=p->next;...}
	}
	bool NextElem(T e, bool(*eq)(T, T), T &next_e)const //返回后驱
	bool ListInsert(int i, T e) //插入
	{
		1、创建两个指针,其中一个指向头节点,另一个用于保存新建结点
		LNode<T> *s, *p=Head;s=new LNode<T>;
		2、p指向第i-1个结点;
		while(p!=NULL && j<i-1)
		3、在第i个结点之前插入e的结点。
	}
	bool ListDelete(int i, T &e)const //删除
	{
		1、创建两个指针,其中一个指向头节点,另一个用于指向删除结点,并释放。
		LNode<T> *q, *p=Head;
		2、p指向第i-1个结点;
		while(p->next!=NULL && j<i-1)
		3、删除结点
	}

主程序:
测试一:基本类型
Main1-3.cpp 验证单链表LinkList类的成员函数
测试二:归并算法(友元函数)
Algo1-4.cpp 归并两个有序链表的算法

1.2.2 双向循环链表

头文件:
DLNode.h 双向链表结点类型结构体
DLinkList.h 双向链表的类(DLinkList类)

//DLinkList.h 双向链表的类(DLinkList类)
	bool ListInsert(int i, T e)
	{
		1、创建两个指针,其中一个指向第i-1个结点,另一个用于保存新建结点
		DLNode<T> *s,*p=GetElemP(i);
		2、在第i个结点之前插入值为e的结点。
	}
	bool ListDelete(int i, T &e)const
	{
		1、创建一个指针,指向第i个结点
		DLNode<T> *p=GetElemP(i);
		2、删除第i个结点。
	}

主程序:
测试一:基本类型
Main1-4.cpp 验证双向循环链表DLinkList类的成员函数

1.2.3 list线性表——STL的链式存储结构

链表类(list):用双向链表实现的
测试一:基本类型
Algo1-5.cpp STL中表(链表)的应用
测试二:自定义类型
Algo1-6.cpp 在STL的list中使用自定义数据类型排序

//Algo1-5.cpp STL中表(链表)的应用
list<int>::iterator ip;
a.push_back(i); a.push_front(1); advance(ip, 2); a.insert(ip, 9); a.erase(ip); a.remove(1); 
a.clear(); a.size(); a.empty(); a.front(); a.back();a.pop_front();a.pop_back();
a.sort();
a.sort(greater<int>());//降序

//Algo1-6.cpp 在STL的list中使用自定义数据类型排序
bool operator <(const Student &a, const Student &b)
{
	return a.score<b.score;
}
bool operator >(const Student &a, const Student &b)
{
	return a.score>b.score;
}
L.sort();
L.sort(greater<Student>());//降序

1.3 静态链表存储结构

特点:顺序存储结构实现链式存储功能。
应用:赫夫曼树
头文件:
StLinkList.h 静态链表的类(StLinkList类)
主程序:
测试一:基本类型
Main1-5.cpp 验证静态链表StLinkList类的成员函数

1、静态链表存储于数组中,但其顺序却像链表一样。
静态链表数组SL中链表头结点位置[0],备用链表头结点在位置[MAX_SIZE-1],其余 MAX_SIZE-2 个结点不在链表中就在备用链表中。
2、单链表的结点通过new命令生成,结点被限制在动态存储区这个大范围内。而静态链表的结点被限制在静态数组这个小范围。
3、单链表不用的结点通过delete命令释放,释放后的结点由编译软件管理;而静态链表的删除结点需要自己管理。
4、从备用链表删除结点或向备用链表插入结点都在表头进行,效率高。

第2章 栈和队列

操作受限的线性表。
它的基类:线性表类。
STL:栈(stack)、队列(queue)。

2.1 栈

逻辑结构:后进先出。
应用:撤销及恢复功能。
栈的抽象基类:AStack.h 栈抽象类的定义

2.1.1 栈的顺序存储结构

SqStack.h 顺序栈的类(SqStack类)
Func2-1.h 验证栈类成员函数的主程序
Main2-1.cpp 验证顺序栈SqStack类的成员函数

//SqStack.h
T *base,*top;  int stacksize; //三个私有数据成员;基址、栈顶指针、栈容量。

bool Push(T e) 
{
	1、追加存储空间(申请2倍的空间)。2、复制数据(从原空间至新空间)。3、释放原栈空间,给数据成员赋新值。
}
2.1.2 栈的链式存储结构

为提高效率,链表表头为栈顶,表尾为栈底。
DLinkStack.h 用双向链表实现链栈的类(DLinkStack类)
Main2-2.cpp 验证链栈DLinkStack类的成员函数

template<typename T>
class DLinkStack:public AStack<T>, public DLinkList<T> //多继承
{
	1、由于DLinkStack类继承了DLinkList类,所以直接继承了DLinkList类的私有成员数据,无需额外增加新的数据。
	2、其间各函数可通过调用DLinkList类的公有成员函数实现。
}
2.1.3 stack ——STL的栈结构

Algo2-1.cpp STL中栈的应用

//Algo2-1.cpp STL中栈的应用
st.push(n); st.empty(); st.size(); st.top(); st.pop();

2.2 栈的应用与递归

2.2.1 数制转换

描述

将十进制数转化为n进制数。例,十进制数1001转化为十六进制数为:3E9

Algo2-2.cpp 将十进制转换为二~十六进制

2.2.2 表达式求值

描述

求解:
1、(0-12)*((5-3)3+2)/(2+2)
2、-5.5
(-(-3/2)*2)

Algo2-3.cpp 算术表达式求值,输入负数要用(0 - 正数)表示
F2-1.txt
F2-2.txt

2.2.3 汉诺塔问题与递归实现

Algo2-4.cpp 用递归函数求解汉诺塔问题

2.2.4 迷宫问题

描述

PosType.h 二维坐标位置类型结构体及重载的运算符
PosDirect.h 带下一步方向的二维坐标位置类型结构体
Algo2-5.cpp 用递归函数和非递归函数求解迷宫问题
F2-3.txt

2.2.5 皇后问题

描述

Algo2-6.cpp 用递归函数和非递归函数求解皇后问题

2.2.6 马踏棋盘问题

描述

Algo2-7.cpp 用递归函数和非递归函数求解马踏棋盘问题

2.3 队列

逻辑结构:先进先出
应用:打印机任务的排队
AQueue.h 队列抽象类的定义

2.2.1 队列的链式存储结构

表头为队头,表尾为队尾;队列类的实现继承了单链表类
LinkQueue.h 链队列的类(LinkQueue类)
Func2-2.h 验证队列类成员函数的主程序
Main2-3.cpp 验证链队列LinkQueue类的成员函数

//LinkQueue.h
private:
	LNode<T> *rear; //在继承的基础之上,又自己添加一个私有成员;
	
2.2.2 队列的顺序存储结构

1、顺序循环队列
SqQueueCy.h 顺序循环队列类(SqQueueCy类)
Main2-4.cpp 验证顺序循环队列SqQueueCy类的成员函数

//SqQueueCy.h
protected: //4个数据成员
	T *base;
	int front;
	int rear;
	int queuesize;

int QueueLength()const //返回队列长度
	{
		return (rear-front+queuesize)%queuesize; //%queuesize可确保返回值小于queuesize
	}
bool EnQueue(T e) //插入队尾元素e
	{
		1、若队列满,则增加存储容量,复制队列元素。
		2、释放原队列空间,重新给数据成员赋值。
		3、将e插入队尾。
	}

循环队列最大的长度等于 队列空间存储-1

2、顺序队列
SqQueue.h 顺序队列类(队头元素固定在[0]单元)
Main2-5.cpp 验证顺序队列SqQueue类的成员函数

private: //3个数据成员
	T *base;
	int rear;
	int queuesize;

bool DeQueue(T &e) //删除队头元素
	{
		1、各元素依次后移。
		2、数据成员rear自减1}

顺序队列类与通常人们排队的方式一样。当元素较多时,时间开销大。

3、顺序不移动队列

SqQueueNM类继承了SqQueueCy类
出队列时不移动元素,但不循环利用原有空间。空间利用率低。

SqQueueNM.h 顺序不移动队列类(出队时不移动元素,只改变头指针的值)
Main2-6.cpp 验证顺序不移动队列SqQueueNM类的成员函数

//SqQueueNM.h  继承了SqQueueCy类的4个保护数据成员。
SqQueueNM(int k):SqQueueCy<T>(k) //调用基类的有参构造函数
	{
	}

4、双端顺序循环队列

DeQueueCy类继承了SqQueueCy类
在队头与队尾都可以进行插入与删除的数据结构,被称为双端队列。

DeQueueCy.h 双端顺序循环队列类(DeQueueCy类)
Main2-7.cpp 验证双端顺序循环队列DeQueueCy类的成员函数

//DeQueueCy.h  继承了SqQueueCy类,无添加其他数据成员,无构造函数。
bool EnQueueAtFront(T e) //在队头插入元素e
{
	1、若队列满,则增加存储容量,复制队列元素。
	2、释放原队列空间,重新给数据成员赋值。
	3、将e插入队头。
}
2.2.3 queue、deque、priority_queue —— STL的队列结构

Algo2-8.cpp STL中队列的应用
Algo2-9.cpp STL中双端队列的应用
Algo2-10.cpp STL中优先队列的应用

//Algo2-8.cpp STL中队列的应用
queue<int> q;
q.push(n); q.empty(); q.size(); q.pop(); q.front(); q.back(); 

//Algo2-9.cpp  deque
void out(int a)
{
	cout<<a<<' ';
}
deque<int> q;
q.push_back(n); q.push_front(n*2); q.front(); q.back(); q.pop_front(); q.pop_back(); q.size()
for_each(q.begin(), q.end(), out); //遍历
//for_each(vector<T>::iterator ip_begin, vector<T>::iterator ip_end, void (*func)(T a))

//Algo2-10.cpp  priority_queue 
class cmp
{
public:
	bool operator()(const PosType a, const PosType b)const //仿函数的定义
	{
		return a.row>b.row; //按PosType的row域升序排序 在队列中为降序储存,所以出队变成了升序。
//		return a.row<b.row; //按PosType的row域降序排序
	}
};

struct PosType
{
	int row, col;
};
PosType p[]={{3, 4}, {5, 6}, {4, 1}}, q;
priority_queue<PosType, vector<PosType>, cmp> pri_queue; //容器为向量
//	priority_queue<PosType, deque<PosType>, cmp> pri_queue;//容器为双端队列
//优先队列的数据类型为PosType;保存数据的容器为vector或deque;cmp为元素的比较方式
//priority_queue内部可能有sort(v.begin(),v.end(),cmp()); //cmp()为仿函数;类似于greater<int>()

pri_queue.push(p[i]); pri_queue.top(); pri_queue.pop();

STL的deque有vector的所有功能;并且可以分块储存,也就是说一个队列的所有元素不必存在一个连续的存储空间。
优先队列priority_queue中的元素入队时插在队尾,出队时按关键字有序出队。可用堆排序实现优先队列。
通过自编比较器类(class cmp),优先队列类可以实现对任何数据类型按任意的要求做比较。

2.4 队列的应用 —— 排队和排队机的模拟

BankQueue.h 模拟银行队列事件的基类(BankQueue类)
BankN.h 模拟银行多队列排队事件的类(BankN类)
Algo2-11.cpp 银行业务(多队列)模拟

Bank1.h 模拟银行排队机事件的类(Bank1类)
Algo2-12.cpp 银行业务(排队机)模拟

第3章 字符串和矩阵

3.1 字符串

3.1.1 字符串的按需(堆)存储结构

HString.h 字符串的类(HString类)
Main3-1.cpp 验证串HString类的成员函数

{
	char operator[](int i)const
	{
		return ch[i];
	}
	HString& operator=(const HString &L) //考虑到 L = L;
	{
		if(this!=&L)
		{
			if(ch!=NULL)
				delete ch;
			ch=new char[L.length];
			assert(ch!=NULL);
			for(int i=0; i<L.length; i++)
				ch[i]=L[i];
			length=L.length;
		}
		return *this;
	}
	void Output( ostream& out )
	{
		for(int i=0; i<length; i++)
			out<<ch[i];
	}
};
ostream& operator << (ostream& out, HString& str)
{
	str.Output(out);
	return out;
}
3.1.2 STL的串结构

Algo3-1.cpp STL中的串

//Algo3-1.cpp STL中的串
char c, *p="God bye!", *q="God luck!";
string t, s(p),r("Good luck!");   string u(r);//四种初始化方式
t.assign(p); t.assign("God bye!"); t=s; t="o"; //四种赋值方式
s.compare(t); //比较
i = r.find(t, i+2); //从r的[i+2]起查找t
r.replace(i, 1, s); //将在r中找到的t用s替代
s.erase(); //清空s
t.erase(0, 5); //从串t的[0]起删除5个字符
s=r.substr(5, 4); //串s为:从串r的[5]起4个字符
t.insert(5, s); //在串t的[5]前插入串s

3.1.3 字符串的模式匹配算法

1、朴素的模式匹配算法
2、KMP算法和改进的KMP算法
Algo3-2.cpp KMP和改进的KMP算法
3、Boyer-Moore算法
Algo3-3.cpp 用类实现BM算法的程序
4、Karp-Rabin算法
Algo3-4.cpp Karp-Rabin算法

3.2 矩阵

3.2.1 多维数组的顺序存储结构

变长参数表:
Algo3-5.cpp 变长参数表(函数的实参个数可变)编程示例

#include<cstdarg> //用于存取变长参数表
T Max(int num, ...) //返回num个数中的最大值
{
	va_list ap; //变长参数表类型
	va_start(ap, num); //ap指向固定参数num后面的实参表
	m=va_arg(ap, T); //读取ap所指的实参,其类型为T,将其赋给m;ap向后移
	va_end(ap); //与va_start()配对,ap不再指向变长参数表
}

任意维数组:
MuArray.h 用vector实现多维数组的类(MuArray类)
Main3-2.cpp 验证多维数组MuArray类的成员函数

//MuArray.h 用vector实现多维数组的类(MuArray类)
private: //一个成员函数,四个数据成员
	vector<T> base; //数组元素
	int dim; //数组维数
	vector<int> bounds; //数组维界
	vector<int>constants; //数组映像函数常量基址
	bool Locate(va_list ap, int &off)const 
	//若ap指示的各项下标合法,则求出该元素在base中的相对地址off
	{
		off+=constants[i]*ind; //相对地址 = 各维的下标值 * 本维的偏移量之和
	}

base.assign(elemtotal, 0); //给base分配elemtotal个空间,其值均为0
constants.assign(dim, 1); //给constants分配dim个空间,其值均为1

3.2.2 矩阵的压缩存储

RLSMatrix.h 三元组行逻辑链接顺序表的类(RLSMatrix类)
Main3-3.cpp 验证稀疏矩阵RLSMatrix类的成员函数

F3-1.txt
F3-2.txt
F3-3.txt

第4章 树与二叉树

操作受限的线性表。
它的基类:线性表类。
STL:栈(stack)、队列(queue)。

4.1 字符串

逻辑结构:先进后出。

4.1.1 栈的顺序存储结构

AVLTNode.h 平衡二叉树的结点类型结构体
AVLTree.h 平衡二叉树的类(AVLTree类)
BiTNode.h 二叉链表结点类型结构体
BiTree.h 二叉链表结构的二叉树类(BiTree类)
BSDTree.h 二叉排序树的删除类(BSDTree类)
BSTree.h 二叉排序树的类(BSTree类)
C4-1.h 对两个数值型关键字的比较约定为如下的宏定义
C4-2.h 设置平衡因子的值(左子树的深度-右子树的深度)
ChangeTree.h 二叉排序树转换操作的类(ChangeTree类)
CSNode.h 孩子-兄弟二叉链表结点类型结构体
CSTree.h 孩子-兄弟二叉链表结构的树或森林类(CSTree类)
F4-1.txt
F4-2.txt
F4-3.txt
F4-4.txt
F4-5.txt
F4-6.txt
F4-7.txt
F4-8.txt
F4-9.txt
F4-10.txt
Func4-1.h 数据类型为基本类型的I/O操作
Func4-2.h 定义数据类型和关键字类型及对它们的I/O操作
Func4-3.h 增加的I/O操作
Func4-4.h 增加的I/O操作
HuffmanNode.h 赫夫曼树结点类型结构体
HuffmanTree.h 赫夫曼树类(HuffmanTree类)
Main4-1.cpp 验证二叉链表结构的二叉树BiTree类的成员函数
Main4-2.cpp 验证三指针链表结构的二叉树PBiTree类的成员函数
Main4-3.cpp 验证二叉链表结构的二叉排序树BSTree类的成员函数
Main4-4.cpp 验证平衡二叉树AVLTree类的成员函数
Main4-5.cpp 验证红黑树RBTree类的成员函数
Main4-6.cpp 验证伸展树SpTree类的成员函数
Main4-7.cpp 验证孩子-兄弟二叉链表结构的树或森林CSTree类的成员函数
Main4-8.cpp 用CSTree类构造森林
Main4-9.cpp 验证赫夫曼树HuffmanTree类的成员函数
PBiTNode.h 三指针链表结点类型结构体
PBiTree.h 三指针链表结构的二叉树类(PBiTree类)
RBTNode.h 红黑树的结点类型结构体
RBTree.h 红黑树的类(RBTree类)
SpTree.h 伸展树的类(SpTree类)

第5章 图

操作受限的线性表。
它的基类:线性表类。
STL:栈(stack)、队列(queue)。

4.1 字符串

逻辑结构:先进后出。

4.1.1 栈的顺序存储结构

AdjListGraph.h 图的邻接表类(AdjListGraph类)
Algo5-1.cpp MatrixGraph类对象调用深度优先和广度优先搜索遍历的程序
Algo5-2.cpp AdjListGraph.h类对象调用深度优先和广度优先搜索遍历的程序
Algo5-3.cpp DFST深度优先生成树类将无向图构造为生成森林,并以孩子-兄弟二叉链表存储之
Algo5-4.cpp 构造最小生成树
Algo5-5.cpp 求连通图关节点的算法
Algo5-6.cpp 输出有向图的一个拓扑序列
Algo5-7.cpp 求关键路径
Algo5-8.cpp 迪杰斯特拉算法,从某个源点到其余各顶点的最短路径
Algo5-9.cpp 调用弗洛伊德类求每两点之间的最短路径
Algo5-10.cpp 调用弗洛伊德类求两城市之间最短距离的程序
C5-1.h 对图的两个顶点相等的宏定义和定义权值类型
F5-1.txt
F5-2.txt
F5-3.txt
F5-4.txt
F5-5.txt
F5-6.txt
F5-7.txt
F5-8.txt
F5-9.txt
F5-10.txt
F5-11.txt
F5-12.txt
F5-13.txt
Floyd.h 弗洛伊德最短路径类(Floyd类)
Func5-1.h 定义顶点结构模板的实参V及对其的I/O操作
Func5-2.h 定义MatrixGraph类中弧结构模板的实参A及对其的I/O操作
Func5-3.h 定义一种顶点结构模板的实参V及对其的I/O操作
Func5-4.h 定义一种MatrixGraph类中弧结构模板的实参A及对其的I/O操作
Func5-5.h 定义AdjListGraph类中弧结构模板的实参A及对其的I/O操作
Func5-6.h 定义一种AdjListGraph类中弧结构模板的实参A及对其的I/O操作
Graph.h 图基类的定义
Main5-1.cpp 验证图的邻接矩阵类(MatrixGraph<VerT, ArcT>)的成员函数
Main5-2.cpp 另一种顶点和弧结构体调用邻接矩阵类的成员函数
Main5-3.cpp 验证图的邻接表类(AdjListGraph<VerT, ArcT>)的成员函数
Main5-4.cpp 验证用于自定义顶点和弧结构体的邻接表类的成员函数
Map.txt
MatrixGraph.h 图的邻接矩阵类(MatrixGraph类)
Topo.h 拓扑类(Topo类)

第6章 查找

操作受限的线性表。
它的基类:线性表类。
STL:栈(stack)、队列(queue)。

4.1 字符串

逻辑结构:先进后出。

4.1.1 栈的顺序存储结构

Algo6-1.cpp 验证SqTable类的成员函数
Algo6-2.cpp 验证HashTable类的成员函数
Algo6-3.cpp 验证BTree类的成员函数
Algo6-4.cpp 验证DLTree类的成员函数
Algo6-5.cpp 验证TrieTree类的成员函数
BTNode.h B树的3种结构体
BTree.h B树类(BTree类)
DLTNode.h 双链键树结点的存储结构
DLTree.h 双链键树类(DLTree类)
F6-1.txt
F6-2.txt
F6-3.txt
F6-4.txt
F6-5.txt
Func6-1.h 定义模板的实参Sc及对其的I/O操作
Func6-2.h 定义模板的实参HD及相应的I/O操作
Func6-3.h 定义模板的实参Record及相应(包括KeyType)的I/O操作
HashTable.h 开地址法哈希表类(HashTable类)
SqTable.h 静态查找表类(SqTable类)
TrieNode.h Trie树结点的存储结构
TrieTree.h Trie树类(TrieTree类)

第7章 内部排序

演示课件

在这里插入图片描述

7.1 插入排序

1、直接插入排序:将待插数据逐一与有序部分的数据作比较,以确定插入位置。
2、折半插入排序:先找出有序部分位于中间的数据,与待插入数据作比较;每比较一次,就可减少一半的比较次数。数据量大时效率高。
3、二路插入排序:先找出有序部分位于中间的数据,与待插入数据作比较;若插在前半部分,则前面的数据向前移,反之,后面的数据向后移。可减少移动次数,但需要一个额外数组。
在这里插入图片描述
InsSort.h 插入排序类
Func7-1.h 定义模板的实参ID及相应的I/O操作
Algo7-1.cpp 验证插入排序类
F7-1.txt

7.2 冒泡排序

在这里插入图片描述
在这里插入图片描述
Algo7-2.cpp 冒泡排序类

7.3 简单选择排序

在这里插入图片描述
Algo7-3.cpp 简单选择排序类

7.4 希尔排序

由直接插入算法改进而来。
Algo7-4.cpp 希尔排序类

7.5 快速排序

快排序的关键在于基准的选择。
在这里插入图片描述
Algo7-5.cpp 快速排序类

7.6 堆排序(不稳定)

1、将顺序存储的数据看成是一颗完全二叉树
2、对于大顶堆,确保每棵子树的根节点都是整个子树中的最大值;这就保证了根节点是所有数据中的最大值,但不保证所有数据有序。
在这里插入图片描述
Heap.h 堆类
Algo7-6.cpp 堆排序类

优先队列由堆排序类实现。
PriQueue.h 优先队列类
Algo7-7.cpp 验证优先队列类的成员函数

7.7 二路归并排序

充分利用了把大问题转化成一个个小的子问题的思想。(由迭代或递归来实现)
在这里插入图片描述
在这里插入图片描述
Algo7-8.cpp 二路归并排序类

7.8 基数排序

Func7-2.h 定义模板的实参Rec及相应的I/O操作
Algo7-9.cpp 用STL实现字符串的基数排序

F7-2.txt

7.9 STL排序算法的应用

Algo7-10.cpp STL排序算法的应用1
Algo7-11.cpp STL排序算法的应用2

7.10 总结

在这里插入图片描述
在这里插入图片描述

第8章 外部排序

操作受限的线性表。
它的基类:线性表类。
STL:栈(stack)、队列(queue)。

4.1 字符串

逻辑结构:先进后出。

4.1.1 栈的顺序存储结构

Algo8-1.cpp
Algo8-2.cpp k路平衡归并类(替代败者树)
Algo8-3.cpp 用优先队列实现置换-选择排序类
F8-1.txt
Func8-1.h 增加的I/O操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构算法与解析(STL版含源码) 的相关文章

  • SIM900A GPRS无线通信

    文章目录 一 模块介绍1 基本概况2 GPRS通信开发说明 二 TCP连接实现及其源码1 TCP连接实现方法2 程序源码 xff08 基于MSP430F149单片机 xff09 1 main c2 Config h及Config c3 SI
  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四
  • float型数据与4字节之间的转换

    文章目录 一 前言二 地址指针转换的方法三 共用体的方法 xff08 注意要定义全局变量数组s xff0c 即地址要分配为固定地址 xff09 一 前言 在与上位机之间进行数据收发 xff0c 要将float型数据转换成字节进行传输 xff
  • USB虚拟串口实现多字节数据接收,基于stm32h743

    文章目录 一 USB虚拟串口原理简介二 接收函数实现源码三 小结 一 USB虚拟串口原理简介 USB 虚拟串口 xff0c 简称 VCP xff0c 是 Virtual COM Port 的简写 xff0c 它是利用 USB 的 CDC 类
  • EC20/EC25 4G模块AT指令开发总结

    文章目录 一 EC25 20 4G模块简介二 AT指令总结1 通用AT指令2 建立TCP UDP连接相关AT指令 三 TCP传输数据流程四 UDP传输数据流程五 总结 一 EC25 20 4G模块简介 EC25 是一系列带分集接收功能的 L
  • C语言实现socket网络编程及多线程编程

    文章目录 一 概述二 TCP socket网络编程1 server端程序实现 xff08 tcp server cpp xff09 2 client端程序实现 xff08 tcp client cpp xff09 3 编译与执行 三 UDP
  • 基于openssl实现https双向身份认证及安全通信

    文章目录 一 概述二 代码设计2 1 ssl server c程序设计2 2 ssl client c程序设计 三 测试 一 概述 https基于SSL TLS提供安全的通信信道 xff0c 基于证书认证技术实现服务器和客户端之间的身份认证
  • ubuntu的不同版本

    ubuntu是现在最流行的Linux安装包 xff0c 本文介绍了ubuntu的各种版本 一 Ubuntu 每个ubuntu的版本都包含一个版本号 xff08 version number xff09 和一个代码名 xff08 code n
  • Linux下通过service服务管理用户进程

    文章目录 一 service配置介绍1 1 service配置文件1 2 配置文件的区块1 3 修改配置文件后重启1 4 服务管理 二 设计一个可执行程序三 设计一个service管理 home ubuntu test servicetes
  • c++中多态调用场景下基类析构函数的virtual声明

    文章目录 一 基类析构函数未加virtual声明的情况1 1 基础示例演示1 2 进阶示例演示 二 基类析构函数添加virtual声明的情况三 总结 一 基类析构函数未加virtual声明的情况 在多态场景中 xff0c 可通过基类的指针指
  • protobuf协议原理及实现,基于c++

    文章目录 一 protobuf协议简介1 1 protobuf协议简介1 2 数据交互xml json protobuf格式比较1 3 关于 ProtoBuf 的一些思考 二 protobuf库安装三 protobuf库使用第一步 xff0
  • OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式 xff0c 8080并口 xff0c IIC xff0c SPI三种驱动方式 xff0c 采用的单片机是STM32F407 文章目录 一 OLED驱动原理介绍二 8080并口驱动方式三 IIC驱动方式四
  • ROS2学习笔记(1)ROS2+docker的配置方法

    ROS2学习笔记 xff08 1 xff09 ros2 43 docker的配置方法 1 前言2 安装docker2 1 docker的发展史2 2 什么是docker2 3 docker的思想2 3 1 集装箱2 3 2 标准化1 运输方
  • ubuntu之更改ubuntu和windows双系统启动顺序

    ubuntu之更改ubuntu和windows双系统启动顺序 背景方法 背景 安装好ubuntu和windows双系统后 xff0c 一般grub引导默认选择第一个为启动项 xff0c 在公司打工还好 xff0c 毕竟要进ubuntu挣钱
  • 【lightDM】组件理解

    前言 LightDM xff08 Light Display Manager xff09 是轻量级 Linux 桌面显示管理器 其目的是成为 X org 的 X Server 的标准显示管理器 LightDM 负责启动 X servers
  • 【机器人学中的状态估计】第一讲

    1 什么是状态估计 xff1f 通过获得传感器的观测值 xff0c 建立观测值到状态量的模型 xff0c 估计出状态量 2 概率密度函数 后验概率 p x y
  • VScode环境下使用git与github远程操作要点记录

    部分内容来源于网络 xff0c 外加了自己的实践 xff0c 记录了一下 文章目录 一 windows上使用git1 官网下载git https git scm com download win 2 创建本地仓库 二 git远程连接gith
  • 【千律】C++基础:TXT文件的创建、写入和读取

    include lt fstream gt include lt iostream gt using namespace std int main 初始化 ifstream iread txt 初始化输入流 ofstream write t
  • Matlab计算福利彩票的中奖概率

    Quez1 计算福彩双色球一等奖的中奖概率 福彩双色球的玩法如下 从编号1 33的红球里任选6个 另外在编号1 16的蓝球里再任选1个 如果选择的红球和蓝球和当期的开奖结果完全一致 顺序可不同 则中一等奖 Analysis 这是一个组合问题

随机推荐

  • 【千律】OpenCV基础:基于梯度的模板匹配

    环境 xff1a Python3 8 和 OpenCV 内容 xff1a 基于梯度的模板匹配 主要关注边缘信息 xff0c 能够较好的识别不同颜色的目标 实现步骤 xff1a 1 给定原图像I和模板T 2 指定差异度 xff08 相似度 x
  • golang使用SM2(SM2withSM3)签名、验签数据

    golang使用SM2签名 验签数据 场景标准密钥签名算法 Start依赖公钥转base64私钥转hex私钥生成公钥生成密钥对Hex私钥转私钥对象base64公钥转公钥对象签名验签 测试 场景 对接招行支付 标准 密钥 私钥 xff1a H
  • 树莓派与pixhawk串口通信

    一 Pixhawk部分 1 读取数据测试 步骤 xff1a 在Firmware src modules中添加一个新的文件夹 xff0c 命名为rw uart在rw uart文件夹中创建CMakeLists txt文件 xff0c 并输入以下
  • 关于pixhawk波特率修改的两种方法

    一 QGC地面站修改 将pixhawk与地面站相连接进入参数设置界面 xff0c 搜索SYS COMPANION参数设置需要的波特率保存设置 二 终端 xff08 Terminal xff09 修改 打开终端 xff0c 进入源码所在Fir
  • gazebo仿真环境搭建

    主要内容 xff1a 安装gazebo配置gazebo运行gazebomavros控制飞机 1安装gazebo 如果已经安装MAVROS可以直接在终端上输入gazebo查看是否已经拥有gazebo xff0c 因为MAVROS中含有gaze
  • Intel Realsense D435i标定详细步骤

    主要介绍Inter D435i深度相机的IMU 相机和IMU与相机外参数标定的过程 其中 IMU使用的是realsense官方文档的教程 相机和外参数使用的是Kalibr的标定方法 本文所介绍过程的所有代码和生成文件资源放在Kalibr工具
  • 在Ubuntu、NVIDIA_TX2下查看CPU/GPU/内存使用率

    一 Ubuntu 1 cpu 内存 1 使用top命令 top 2 更直观的工具htop sudo apt get install htop htop 2 gpu 用nivida smi命令 xff0c nvidia smi 这个命令只能显
  • 基于RT-Thread OS的 迷你时钟项目

    基于RT Thread OS的 迷你时钟项目 近期在自学RT Thread OS 这是一个国内团队开发的实时物联网操作系统 xff0c 具有组件完整丰富 高度可伸缩 简易开发等优点 RTOS官网 参考学习文档 作品演示 基于RT Threa
  • C++_namespace命名空间

    catalog 内嵌enum class namespace命名冲突多个同名namespace的原理开头 变量 函数前命名空间前 规范写法作用域Base定义顺序 内嵌 c 43 43 17后 支持 namespace A B C 写法 en
  • c++_exception异常,try和catch,noexcept,throw

    catalog noexcept 函数base自定义异常类noexcept 和 throw noexcept 函数 bool f 61 noexcept func 判断 func 函数 是否有标记noexcept base throw 是
  • SQL4种匹配规则

    SQL提供了四种匹配模式 xff1a 1 表示任意0个或多个 字符 如下语句 xff1a Select FROM user Where name LIKE 39 三 39 将会把name为 张三 xff0c 三脚猫 xff0c 唐三藏 等等
  • SDN的HUB实验

    SDN的hub实验 首先需要搭建ryu控制器环境和mininet环境 使用winscp将hub的py代码上传到服务器啊贝云 使用命令搭建拓扑环境 mn topo 61 single xff0c 3 controller 61 remote
  • CSDN上代码块背景颜色的设置

    CSDN上代码块背景颜色的设置 今天发博客的时候发现代码块背景的颜色是白色的 xff0c 我想要改成黑色的 xff0c 于是就研究了一下怎么修改代码块背景的颜色 xff0c 修改代码块的背景颜色只要4步 1 点击个人头像打开管理博客 2 在
  • 模拟电路和数字电路PCB设计的区别

    本文就旁路电容 电源 地线设计 电压误差和由PCB布线引起的电磁干扰 EMI 等几个方面 xff0c 讨论模拟和数字布线的基本相似之处及差别 工程领域中的数字设计人员和数字电路板设计专家在不断增加 xff0c 这反映了行业的发展趋势 尽管对
  • k8s部署资源服务的注意事项

    前言 为了k8s的资源服务能够高效 稳定 健康的运转 xff0c 需要对其进行相应的设置 资源类别 声明每个Pod的resource 在使用k8s集群时 xff0c 经常会遇到 xff1a 在一个节点上调度了太多的Pod xff0c 导致节
  • OCR中有见解的评论

    一 关于人脑与计算机识别的区别 电脑识别最主要是依赖简单的线性分类问题 把20 20个像素直接展成400维向量 xff0c 分类之 虽然现在的算法越来越常见地引入了非线性 xff0c 但是这种非线性的复杂度还是远没法和人脑相比 人脑则是多层
  • 梯度响应图——针对无纹理目标的检测

    题目 xff1a Gradient response maps for real time detection of textureless objects amp emsp xff1b gt amp ensp xff1b gt amp n
  • 深度学习技术在语义分割中的应用综述

    论文题目 xff1a A Review on Deep Learning Techniques Applied to Semantic Segmentation 博客园上的翻译 知乎上的提取 CSDN上的总结1 CSDN上的总结2
  • A Survey on Optical Character Recognition System 光学字符识别系统综述

    论文题目 xff1a 2017 A Survey on Optical Character Recognition System 摘要 光学字符识别 xff08 OCR xff09 是近年来研究的热点 它被定义为将文档图像数字化为其组成字符
  • 数据结构算法与解析(STL版含源码)

    文章目录 第1章 线性表1 1 顺序存储结构1 1 1 顺序表1 1 2 vector线性表 STL的顺序存储结构 1 2 链式存储结构1 2 1 单链表1 2 2 双向循环链表1 2 3 list线性表 STL的链式存储结构 1 3 静态