线性数据结构

线性表

是一种抽象的数学概念,是一组元素的序列的抽象,它由有穷个元素组成(0 个或任意个)。包括顺序表和链接表。

顺序表:使用一大块连续的内存顺序存储表中的元素,这样实现的表称为顺序表,或称连续表 在顺序表中,元素的关系使用顺序表的存储顺序自然地表示;

链接表:在存储空间中将分散存储的元素链接起来,这种实现称为链接表,简称链表。

常见线性数据结构

顺序表

  • CRUD,数组;go中数组、切片,线性数据结构的物理实现。

链接表

  • CRUD,list,线性数据结构的物理实现

栈stack

  • 后进先出(LIFO),不可以首部、中间操作

队列queue

  • 先进先出(FIFO),不可以中间和尾部移除,首部移除,增加只能在尾部,中间和尾部不可以插入
  • 先进后出(LIFO),只能尾部追加,尾部移除
  • 双端队列(deque),两头操作,操作只能在两头,尾部追加或移除,首部插入或移除,中间不可以操作

PS:优先队列,数据结构是堆(小顶堆实现),不属于线性数据结构

 数组
长度不可变、 内容可变、 可索引、 值类型、 顺序表
定义方式
var a0 [3]int                   // 零值初始化3个元素的数组
var a1 = [3]int{}               // 零值初始化3个元素的数组
// [3]int是类型,[3]int{} 是字面量值
var a2 [3]int = [3]int{1, 3, 5} // 声明且初始化
var a3 = [3]int{1, 3, 5}        // 声明且初始化

const count = 3
a4 := [count]int{1, 3, 5} // 此处的count为常量,变量的话不支持,变量是可变的,数组的声明是需要明确长度的。
// 二维数组
a8 := [2][3]int{{100}} // 两行三列 [[100 0 0] [0 0 0]]
// [[10 0 0] [11 12 0] [13 14 15] [16 0 0]]
// 多维数组,只有第一维才能用...推测
// 第一维有4个,第二维有3个。可以看做4行3列的表
a9 := [...][3]int{{10}, {11, 12}, {13, 14, 15}, {16}} 

思考:三维数组怎么定义?怎么去理解?

 

长度和容量
cap即capacity,容量,表示给数组分配的内存空间可以容纳多少个元素
len即length,长度,指的是容器中目前有几个元素
由于数组创建时就必须确定的元素个数,且不能改变长度,所以不需要预留多余的内存空间,因此cap 和len对数组来说相等。
索引
Go语言不支持负索引。通过[index]来获取该位置上的值。索引范围就是[0, 长度-1]。
a5 := [...]int{10, 30, 50}
a5[0] += 100  // 通过索引来修改值

 

下面是int类型的数组

 下面是string类型数组,对于string类型数组,与int有不同之处,因为string本身长度是可变的,所以不能再像整形那样直接在内存地址中存内容了。

在go中string类型底层其实就是顺序表,对于string类型的数组,不管数组中的元素长度大小,每个元素间隔都是16字节,内存地址中是存储的string的地址,可以理解位二级指针。

 值类型

通过下面示例,可以看出,Go语言在这些地方对数组进行了值拷贝,都生成了一份副本;

在go中,不同的标识符赋值,往往是建立副本

 
posted on 2023-06-05 11:31  自然洒脱  阅读(19)  评论(0编辑  收藏  举报