数组:
- 二维数组可以省略行数,不可以省略列数
- 元素存储的首地址为前一个元素的尾地址
- 对于二维数组a,a是行指针,&(*(a+1)+2)表示a第二行第二列元素的地址;②&a+1为二维指针,即从a向后跳过一个完整数组全占用的内存空间,即a地址+sizeof(a)
- 数组名是常量指针,不能自身++,*a++错误,也不能赋值a=错误
- a+sizeof(int)等价于a[4]的地址,因为a+1前进了4个字节
字符串:
- ①StringBuffer是一个线程安全的可修改的字符序列;②StringBuilder是线程不安全的可修改的字符序列;③String的值是不可变的,所以是线程安全
- 存储数据时,通常不仅要存储数据元素的值,还要存储元素之间的关系
- 字符串是一种特殊的线性表,每个结点为一个字符
- 字符串打印时 — 表示左对齐,第一个数表示宽度,小数点后表示打印数
- n个字符的字符串全排列方式为A(n,n),每出现一个字符重复就/2
- 定义字符串时如果=右边有变量则重新创建一个新的对象
链表:
- 线性表的长度是所包含的元素的个数
- 链表用于管理磁盘空闲块
栈:
- n个数的出栈方式数量为卡特兰数,f(n)=C(2n,n)/(n+1)
- 用带头,尾指针的单向链表表示一个栈,该栈的栈顶指针top设置为链表头
- 对于栈用栈顶指针表示栈顶,而栈的插入和删除操作均在栈顶进行
队列:
- ①循环队列队空时:front=rear;链队列为空时:首尾指针都为空,如果front=rear,链队列里有一个元素②循环队列队满时:(rear+1)%maxsize=front
- 对于队列用队头和队尾指针分别表示允许插入和删除的一端
- 求循环队列中的元素个数的公式为:(rear-front+size)%size
- 链队列首指针指向首元素,尾指针指向尾元素。循环队列首指针指向首元素,尾指针指向尾元素的后一位。
树:
- 二叉树结点N0=N2+1
- Huffman树N0=N,只有度为0和2的结点,且N0=N2+1
- B+树用于文件索引和数据库索引,以及查找硬盘数据
- 线索二叉树LTag=0指向左孩子,LTag=1指向前驱;RTag对应右孩子和后继
- B*树:在B+树的基础上增加指向兄弟的指针
- 森林转二叉树时,将森林每个结点左指针指向该结点的孩子,右指针指向该结点的兄弟
图:
1.有向完全图边数:n(n-1),无向完全图边数:n(n-1)/2
2.对连通图调用一次深度优先遍历可以访问到图中所有顶点,非连通图不行
堆:
- 堆和栈的区别:①栈由系统自动分配,获得空间小,申请速度快,为连续的空间,生长方向向下,即内存地址减少的方向增长;堆是人为申请开辟,获得空间大,申请速度慢,为不连续的空间,生长方向向上,即内存地址增大的方向增长。②栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数各参数进栈,静态变量不进栈;堆是在头部用一个字节存放堆的大小,堆中内容由人为安排。③堆是共有的空间,在操作系统对进程初始化时进行分配,栈是线程独有,用于保存运行状态、局部变量等。
- 有n个元素的序列,若使用筛选法建堆,则从位置为n/2取下整的元素开始建堆
- 用堆来实现具有优先级的队列