数组(Arrays)
也叫列表(list)或向量(Vector),数组的值一个个连续的存在内存中,所以不像之前,一个变量只存一个值(如j=5),我们可以把多个值存在数组变量里。为了拿出数组中某个值,我们要指定一个下表(index),大多数编程语言里,数组下标都是从0开始,用方括号[]代表访问数组,如果想在变量a里存入两数相加,可以写上图一行代码。
数组有7个数字,像上图一样按顺序存。写j[0]回去内存地址1000,加0个偏移,得到地址1000,拿值:5
如果写j[5],会去内存地址1000,加5个偏移,拿到地址1005,拿值:4
很容易混淆“数组中第5个数”和“数组小标为5的数”,下标5其实是数组第6个数
字符串(string)
数组其实就是字母,数字,标点符号等组成的数组。
例如j=“STAN ROCKS”,虽然长得不像数组,但的确是数组
不是“字符0”,是二进制0,这叫字符null,表示字符串结尾
如果调用print,会从开始位置,逐个显示到屏幕,但得知道什么时候停下来,否则会把内存里的东西都显示出来,0告诉函数什么时候停止
stract
stract接受两个字符串,把第二个放到第一个结尾。
矩阵(MARTIX)
可以把矩阵看成数组的数组
为了拿到一个值,需要两个下标,比如j[2][1]
告诉计算机在找数组2里,位置是1的元素,得到数字12
我们可以做任意维度的矩阵,我们可以做一个5维矩阵,然后这样访问a=j[2][0][18][18][3]
结构体(STRUCT)
多个变量打包在一起,叫结构体,现在多个不同类型的数据可以放在一起
甚至可以做一个数组,里面放多个结构体,这些数据在内存里,会自动打包在一起
如果写j[0],能拿到j[0]里的结构体,然后拿到银行账户和余额。
NODE
存结构体的数组和其他数组一样,创建时就有固定大小,不能动态增加大小,还有,数组在内存中按顺序存储,在中间插一个值很困难,但结构体可以创造更复杂的数据结构,消除这些限制
node它存一个变量,一个指针(pointer),指针是一种特殊变量,指向一个内存地址,因此得名。
用节点可以做链表(linked list),灵活性是通过每个节点指向下一个节点实现的
假设有3个节点没在内存地址1000,1002,1008,隔开的原因可能是创建时间不同,它们之间有其他数据
可以看到第一个节点值是7,指向地址1008,代表下一个节点存在内存地址1008
在1002内存地址,值是14指向1000,形成循环,这样是循环链表,但链表也可以是非循环的,最后一个指针是0,“null”代表链表尽头
当程序员用链表时候,很少看指针具体指向哪里,而是用链表抽象模型,就像上图 ,更容易懂,数组的大小需要预先定好,链表的大小可以动态增加,可以创建一个新节点动态的改变指针值,把新节点插入链表
链表也很容易重新排序,两端缩减,分割,倒序等,也可以用上述的排序
因为灵活,很多复杂的数据结构都用链表,最出名的是队列(queue)和栈(stack)
队列(queue)
队列使用先进先出(FIFO)
想象有个指针叫邮局队列,指向链表第一个节点,第一个节点是HANK,服务完HANK后,读取HAN的指针,把邮局队列指向下一个人,这样HANK“出队”(dequeue),如果想把某人"入队"(enqueue)意思是加入队列里,要遍历整个链表到结尾,然后把结尾指针,指向新人NIck
栈(stack)
只要稍作修改就能用链表做栈,栈是后进先出(LIFO)。
可以把栈想成一堆松饼,做好一个松饼就堆在之前上面。吃的时候从最上面开始,栈的进出叫入栈(push)和出站(pop)
树(tree)
如果把节点改一下,改成两个指针,就能做树(tree)