基础数据结构与算法(C++描述)
数据结构
数组
基本概念
数组可以存储一个固定大小的相同类型元素的顺序集合。
声明数组
指定元素的类型和元素的数量,arraySize必须是一个大于零的整数常量,type可以是任意有效的 C++ 数据类型。
type arrayName [ arraySize ];
初始化数组
使用一个初始化语句。
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
省略掉了数组的大小,数组的大小则为初始化时元素的个数,使用sizeof求数组大小。
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
int num_elements = sizeof(balance) / sizeof(balance[0]);
所有数组元素初始化为0
int array[5] = {0};
访问数组
-
使用下标索引
-
使用指针
double runoobAarray[50]; double *p = runoobAarray; /* runoobAarray是指向数组第一个元素的指针 */ p = &runoobAarray[0]; p = p + 1; /* p指向runoobAarray[1] */ *p = 1; /* runoobAarray[1] = 1 */ *(runoobAarray + 2) = 1; /* runoobAarray[2] = 1 */
多维数组
声明一个 x 行 y 列的二维整型数组
type arrayName [ x ][ y ];
初始化二维数组
int a[3][4] = {
{0, 1, 2, 3} , /* 初始化索引号为 0 的行 */
{4, 5, 6, 7} , /* 初始化索引号为 1 的行 */
{8, 9, 10, 11} /* 初始化索引号为 2 的行 */
};
int b[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
函数参数
函数参数而言,数组的长度是无关紧要的,因为 C++ 不会对形式参数执行边界检查。
void myFunction_1(int *param);
void myFunction_2(int param[10]);
void myFunction_3(int param[]);
字符串
链表
单向链表
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode *p) : val(x), next(p) {}
};
双向链表
struct ListNode {
int val;
ListNode *pre;
ListNode *next;
ListNode() : val(0), pre(nullptr), next(nullptr) {}
ListNode(int x) : val(x), pre(nullptr), next(nullptr) {}
ListNode(int x, ListNode *p) : val(x), pre(p) {}
};
链表操作
- 插入:首插法、尾插法
- 删除
- 指针遍历
栈
队列
树
算法
搜索
二分搜索
BFS
DFS
排序
排序复杂度
分类
- 稳定:冒泡、插入、归并
- 非稳定:快排,选择,希尔,堆
位运算
哈希
时间复杂度
参考资料
《数据结构 C++语言版》