数组
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据
数组,链表,队列,栈都是线性表结构
非线性表结构有 树,二叉树,堆,图等
数组下标从0开始,确切定义是偏移offset,用a来表示数组首位地址,a[0]就是偏移为0的位置
a[k]表示k个type_size 位置,计算a[k]内存地址的公式
a[k]_address = hbase_address + k * type_size
如果下标从1开始,则计算a[k]内存地址就变为
a[k]_address = hbase_address + (k-1)*type_size
数组的 O(1)插入
如果数组不要求有序,假设插入到第k个位置,可以先将第k位的元素移到数组最后,
再将新元素插入到第k位
假设数组中有a,b,c,d,e几个元素,将x插入到第三个位置,只需要将c移到a[5],结果就是
a,b,x,d,e,c
如果删除时不要求数据一定连续,可以将多次的删除操作合并到一起执行,提高效率
这就是JVM标记清除垃圾算法的核心
一段死循环代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int i = 0;
int arr[3] = {0};
for(;i<=3;i++) {
arr[i] = 0;
printf("hello world\n");
}
return 0;
}
栈是从高到低增长的,所以栈中的元素顺序是i,a[2],a[1],a[0]对如下代码
int i = 0;
int j = 1;
int k = 2;
int arr[3] = {0};
cout<<"i-"<<&i<<endl;
cout<<"j-"<<&j<<endl;
cout<<"k-"<<&k<<endl;
cout<<"arr-"<<&arr<<endl;
cout<<"arr3-"<<&arr[3]<<endl;
运行结果:
i-0x28ff0c
j-0x28ff08
k-0x28ff04
arr-0x28fef8
arr3-0x28ff04
链表
- 单链表
- 循环单链表(约瑟夫环问题)
- 双链表
- 双向循环链表
几个写链表的技巧
- 理解指针或引用的含义
- 警惕指针丢失和内存泄露
- 利用哨兵建好实现难度
- 重点留意边界条件处理
- 举例画图辅助思考
5个常见的链表操作
- 单链表反转
- 链表中的循环检测
- 两个有序的链表合并
- 删除链表倒数第n个节点
- 求链表的中间节点
其他
一个字符串中是否有回文字符串
单链表存储的字符串,如何判断回文