数据结构与算法--线性数据结构

数组

数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据
数组,链表,队列,栈都是线性表结构
非线性表结构有 树,二叉树,堆,图等


数组下标从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个节点
  • 求链表的中间节点

其他
一个字符串中是否有回文字符串
单链表存储的字符串,如何判断回文

猜你喜欢

转载自blog.csdn.net/hixiaoxiaoniao/article/details/88541699