数据结构 - 数组操作

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

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

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 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 374 关注
  • 数据结构
    87 引用 • 115 回帖 • 4 关注

相关帖子

欢迎来到这里!

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

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