学习笔记13------数据结构①

1:数组

所谓的数组:是指一系列同一类型数据的集合。

1.1数组定义

var a [10]int

数组定义也是通过var 关键字,后面是数组的名字a,长度是10,类型是整型。表示:数组a能够存储10个整型数字。也就是说,数组a的长度是10。
当定义完成数组a后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。

1.2数组赋值

var a[10] int 表示的范围是a[0],a[1],a[2]…….,a[9]

package main

import "fmt"

func main() {
   var a [10]int
   a[0]=1
   a[1]=1
   a[2]=1
   a[3]=1
   a[4]=1
   a[5]=1
   a[6]=1
   a[7]=1
   a[8]=1
   a[9]=1
fmt.Println(a)
}
//输出结果
//[1 1 1 1 1 1 1 1 1 1]

1.3·数组初始化

package main

import "fmt"

func main() {
   var a [10]int=[10]int{1,3,4,5,6,7,8,9,0}
    fmt.Println(a)

1.4 数组冒泡排序

如何对数组中存储的数据,按照从大到小,或者从小到大进行排序?可以使用冒泡排序。
分析过程:

package main

import "fmt"

func main() {

  arr:=[...]int{1,3,5,6,7,0,8,-1,-5,-6,-7,-8,0}
  for i:=0;i<len(arr)-1;i++{
     for j:=0;j<len(arr)-1-i;j++{
      if arr[j]>arr[j+1]{
         arr[j],arr[j+1]=arr[j+1],arr[j]
      }
     }
  }
fmt.Println(arr)
}
输出结果
[-8 -7 -6 -5 -1 0 0 1 3 5 6 7 8]

1.6数组作为函数参数

package main

import "fmt"
func test(a [5]int){
   a[0]=1111
   fmt.Println(a)
}
func main() {

   arr:=[5]int{1,3,5,6,4}
   test(arr)
   fmt.Println(arr)
}
输出结果
[1111 3 5 6 4]

1.7练习:

用方法来实现:有一个字符串数组: { “马龙”, “迈克尔乔丹”, “雷吉米勒”, “蒂姆邓肯”, “科比布莱恩特” },请输出最长的字符串。

package main

import "fmt"
func test(a [5]string) string{
   var ma string
   ma=a[0]
   for i:=0;i<len(a);i++{
      if len(a[i])>len(ma){
         ma=a[i]
      }
   }
 return ma
}
func main() {

   arr:=[5]string{ "马龙", "迈克尔乔丹", "雷吉米勒", "蒂姆邓肯", "科比布莱恩特"}
   b:=test(arr)
   fmt.Println(b)
}
输出结果
科比布莱恩特

2.切片

2.1

切片:切片与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大,所以可以将切片理解成“动态数组”。

2.2切片定义方式

package main

import "fmt"

func main() {
  s:=[]int{1,3,5,6,8,3,5,7}

  fmt.Println(s)
}
输出结果
[1 3 5 6 8 3 5 7]

append( )函数:第一个参数表示向哪个切片追加数据,后面表示具体追加的数据。

package main

import "fmt"

func main() {
  s:=[]int{}
  s=append(s,3,5,7)
  fmt.Println(s)
}
//输出结果
//[3 5 7]

通过make函数

package main

import "fmt"

func main() {
  s:=make([]int,3,5)
  fmt.Println(s)
}
//输出结果
//[0 0 0]

//借助make函数, 格式 make(切片类型, 长度, 容量)
什么是切片的长度与容量?
长度是已经初始化的空间(以上切片s初始空间默认值都是0)。容量是已经开辟的空间,包括已经初始化的空间和空闲的空间。

2.3切片截取

package main

import "fmt"

func main() {
 s:=[]int{10,20,30,0,0}
 slice:=s[0:3:5]
 fmt.Println(slice)
}
//输出结果
//[10 20 30]

s[0:3:5]是什么意思呢?
我们可以使用s[low:high:max]来表示
第一个数(low)表示下标的起点(从该位置开始截取),如果low取值为0表示从第一个元素开始截取,也就是对应的切片s中的10
第二个数(high)表示取到哪结束,也就是下标的终点(不包含该位置),3表示取出下标是0,1,2的数据(10,20,30),不包括下标为3的数据,那么也就是说取出的数据长度是3. 可以根据公式:3-0 计算(len=high-low),也就是第二个数减去第一个数,差就是数据长度。在这里可以将长度理解成取出的数据的个数。
第三个数用来计算容量,所谓容量:是指切片目前可容纳的最多元素个数。通过公式5-0计算(cap=max-low),也就是第三个数据减去第一个数。该案例中容量为5

关于切片的截取还有其它的操作,如下所示:
这里写图片描述

2.4 copy函数的使用

在第一节中,已经给大家讲解过切片与数组很大的一个区别就是:切片的长度是不固定的,可以向已经定义的切片中追加数据。并且也给大家简单的演示过通过append的函数,在原切片的末尾添加元素。
基本语法:copy(切片1,切片2)

将第二个切片里面的元素,拷贝到第一个切片中。

package main

import "fmt"

func main() {
 s:=[]int{10,20,30,0,0}
 c:=[]int{6,6}
 copy(s,c)
 fmt.Println(s)
}
//输出结果
//[6 6 30 0 0]

倒转

package main

import "fmt"

func main() {
 s:=[]int{10,20,30,0,0}
 c:=[]int{6,6}
 copy(c,s)
 fmt.Println(c)
}
//输出结果
//[10 20]

2.5切片作为函数参数

切片也可以作为函数参数,那么与数组作为函数参数有什么区别呢?
接下来通过一个案例,演示一下切片作为函数参数。

package main

import "fmt"

func InitData(num []int){
   for i:=0;i<len(num);i++{
      num[i]=i
   }
}
func main() {
 s:=make([]int,10)
 InitData(s)
   for _,v:=range s {
      fmt.Println(v)
   }

}
//输出结果
//0
//1
//2
//3
//4
//5
//6
//7
//8
//9

通过以上案例,发现在主函数main( )中,定义了一个切片s,然后调用InitData( )函数,将切片s作为实参传递到该函数中,并在InitData( )函数中完成初始化,该函数并没有返回值,但是在主函数中直接打印切片s,发现能够输出对应的值。也就是在InitData( )函数中对形参切片num赋值,影响到了main( )函数中的切片s.
但是,大家仔细想一下,如果我们这里传递参数不是切片,而是数组,那么能否完成该操作呢?
那么我们将上面的程序,修改成以数组作为参数进行传递的形式:

package main

import "fmt"

func InitData(num [10]int){
   for i:=0;i<len(num);i++{
      num[i]=i
   }
}
func main() {
   var s [10]int
   InitData(s)
   for _,v:=range s {
      fmt.Println(v)
   }

}
//输出结果
//0
//0
//0
//0
//0
//0
//0
//0
//0
//0

发现以数组的形式作为参数,并不能完成我们的要求,所以切片作为函数实参与数组作为函数实参,进行传递时,传递的方式是不一样的。切片为地址传递,数组为值传递。

猜你喜欢

转载自blog.csdn.net/weixin_42927934/article/details/82085231