首页 > 编程语言 > 详细

数据结构 - 数组

时间:2021-05-28 14:25:56      阅读:21      评论:0      收藏:0      [点我收藏+]


1. 数组

技术分享图片
package main

import "fmt"

// 定义结构体声明数组中有哪些元素
type Array struct {
	Data []interface{}   // 泛型数组,支持多种数据类型 String,Int,Array
	Size int  // 数组中的长度
}

// 创建构造函数,初始化数值
func (a *Array) construct(capaCity int) {
	a.Data = make([]interface{}, capaCity)   // 创建数组,自定容量
	a.Size = 0  // 数组的长度
}

// 获取数组中的长度
func (a *Array) len() int {
	return a.Size
}

// 获取数组容量
func (a *Array) capaCity() int {
	return len(a.Data)
}

// 判断数组是否为空
func (a *Array) is_empty() bool {
	return a.Size == 0
}

// 添加尾部元素
func (a *Array) add_last(val interface{}) {
	a.add(a.Size, val)
}

// 添加头部元素
func (a *Array) add_fast(val interface{}) {
	a.add(0, val)
}

// 添加指定元素
func (a *Array) add(index int, val interface{}) {

	if index < 0 || index > a.capaCity() {
		fmt.Print("添加失败2")
		return
	}

	if a.Size == a.capaCity() {
		a.resize(a.capaCity() * 2)   // 扩容多少,根据当前数组已存在的数据长度2倍(或3倍)
	}

	// 如 数组[1, 2, 3, 4], index = 2,那么a.Size = 5,此时 a.Size-1 需要 -1 定位 i 位置
	for i:=a.Size-1; i>=index; i-- {
		a.Data[i+1] = a.Data[i]
	}
	a.Data[index] = val
	a.Size ++
}

// 判断元素是否存在数组中
func (a *Array) in_array(val int) bool {
	for i:=0; i<a.Size; i++ {  // 循环数组中每一个元素,进行比较
		if a.Data[i] == val {
			return true
		}
 	}
 	return false
}

// 删除元素
func (a *Array) del(index int) interface{} {

	if index < 0 || index >= a.Size {
		return -1
	}

	val := a.Data[index] // 存储需要删除的值,并返回

	// 如 数组[5, 9, 2, 8],index = 2 。那么 index=3,size=4,值2,8的键值-1
	for i:=index+1; i<a.Size; i++ {
		a.Data[i-1] = a.Data[i]
	}
	a.Size --
	a.Data[a.Size] = nil   // // 最后一个退回的值设置为nil

	// 缩容
	if a.Size == a.capaCity() / 4 && a.Size != 1 {
		a.resize(a.capaCity() / 2)
	}

	return val
}

// 删除第一个元素
func (a *Array) del_fast() interface{} {
	return a.del(0)
}

// 删除最后一个元素
func (a *Array) del_last() interface{} {
	return a.del(a.Size-1)
}

// 变更容量
func (a *Array) resize(capacity int) {
	arr := make([]interface{}, capacity)   // 创建数组,自定容量
	for i:=0; i<a.Size; i++ {
		arr[i] = a.Data[i]
	}
	a.Data = arr
}

// 打印数组
func (a *Array) print() {
	fmt.Print(a.Data, "\n")
}

func main () {
	var arr Array
	arr.construct(3)  // 设置动态数组,需开辟空间
	arr.add(0, 99)  // 添加
	arr.add_last(66)
	arr.add_last(77)
	arr.del(1)   // 删除

	arr.print()
}

数据结构 - 数组

原文:https://www.cnblogs.com/linsonga/p/14821818.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!