数据结构 - 数组操作

本贴最后更新于 1992 天前,其中的信息可能已经水流花落

数据结构中的数组基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取数组的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!

1、 场景

1.1、 中文描述

数据结构中的数组基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取数组的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!

2、 代码示例

2.1、 定义一个数组结构

//定义一个结构体 type Array struct { data []int //数组 length int //长度 }

2.2、 新建一个数组

// 我们这里做一个建立数组的方法 func NewArray(capacity uint) *Array { //因为我们数组的长度不能为0 因为0初始化没有意义 if capacity == 0 { return nil } return &Array{ data: make([]int, capacity, capacity), length: 0, } }

2.3、 取当前数组的长度

//取当前数组的长度 func (this *Array) Len() uint { return uint(this.length) }

2.4、 检查数组是否越界

//判断数组是否越界 true:越界 false:没有越界 n~n-1 func (this *Array) isIndexOutOfRange(index uint) bool { if index >= uint(cap(this.data)) { return true } return false }

2.5、 索引查找数组中的数据

//这个根据索引查找数组中的数据 func (this *Array) Find(index uint) (int, error) { if this.isIndexOutOfRange(index) { return 0, errors.New("数组下标越界") } return this.data[index], nil }

2.6、 插入指定数组索引值

//给指定的值插入到指定索引上. 返回错误 func (this *Array) Insert(index uint, v int) error { //第一步检查数组的时候已经满载 if this.Len() == uint(cap(this.data)) { return errors.New("数组已经满了!不可增加值") } if this.isIndexOutOfRange(index) && index != uint(this.length) { return errors.New("数组下标越界!") } for i := this.length; int(index) < i; i-- { //index后的元素后移 this.data[i] = this.data[i-1] } this.data[index] = v this.length++ return nil }

2.7、 追加元素到数组尾部

//追加元素到数组的尾部 func (this *Array) InsertToTail(v int) error { return this.Insert(this.Len(), v) }

2.8、 删除指定索引上的值

//删除指定索引上的值 func (this *Array) Delete(index uint) (int, error) { if this.isIndexOutOfRange(index) { return 0, errors.New("索引下标越界") } //去除指定索引上的值 v := this.data[index] //把删除后的元素的其他索引元素前移 for i := index; i < this.Len()-1; i++ { this.data[i] = this.data[i+1] } //更新数组长度 this.length-- return v, nil }

2.9、 打印数组

//输出一个数组 func (this *Array) Print() { var format string for i := uint(0); i < this.Len(); i++ { //拼接数组 format += fmt.Sprintf("|%+v", this.data[i]) } fmt.Println(format) }

3、 测试源码

测试方法我上面都追加有测试的命令.可以测试使用

//测试数组插入方法 go test -v -run TestArray_Insert -o array_test.go func TestArray_Insert(t *testing.T) { capacity := 10 arr := NewArray(uint(capacity)) for i := 0; i < capacity-2; i++ { //循环入数组 err := arr.Insert(uint(i), i+1) if err != nil { t.Fatal(err.Error()) } } arr.Print() _ = arr.Insert(uint(6), 999) arr.Print() _ = arr.InsertToTail(555) arr.Print() } // 测试删除方法 go test -v -run TestArray_Delete -o array_test.go func TestArray_Delete(t *testing.T) { capacity := 10 arr := NewArray(uint(capacity)) for i := 0; i < capacity; i++ { err := arr.Insert(uint(i), i+1) if nil != err { t.Fatal(err.Error()) } } arr.Print() //这里做循环删除 for i := 9; i >= 0; i-- { _, err := arr.Delete(uint(i)) if nil != err { t.Fatal(err) } arr.Print() } arr.Print() } // 测试 go test -v -run TestArray_Find -o array_test.go func TestArray_Find(t *testing.T) { capacity := 10 arr := NewArray(uint(capacity)) for i := 0; i < capacity; i++ { err := arr.Insert(uint(i), i+1) if nil != err { t.Fatal(err.Error()) } } arr.Print() t.Log(arr.Find(0)) t.Log(arr.Find(9)) t.Log(arr.Find(11)) }

4、 源码

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 250 关注
  • 数据结构
    87 引用 • 115 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...