数据结构复习

数据结构

数组、字符串、链表、树、栈、队列。c++

1.数组

数组占着一段连续的内存进行存储的数据结构。在建立数组时,须要指定数组的容量大小,先为其分配内存。即时只在数组中存放一个数字,也要为其预先分配全部的内存。数组

因为内存连续,能够在O(1)的时间直接进行读写,时间效率高。能够利用这个优势来建立哈希表。数组下标做为key,下标对应的内容做为value,组成了健值对的配对。数据结构

动态数组能够解决数组空间效率不高的问题,如c++的stl中的vector。先开辟较小的空间,当空间不足时,从新分配一块原来空间两倍的空间。将数据转移到新数组中,将以前的数组内存释放。可是这样也对时间性能有负面影响。因此动态数组要尽可能少改变容量大小的次数函数

建立一个数组时,数组名其实就是一个指针,指向数组的第一个元素。一样也能够经过指针来访问数组,前提要注意确保不要超出数组的边界。
(在c/c++中,将数组做为函数参数传递时,会退化为同类型的指针。)
练习:二维数组查询性能

2.字符串

C/C++中每一个字符串都是以‘\0’结束,要注意是否形成了字符串的越界。
为了节省内存,c/c++把常量字符串存放到一个单独的内存区域,当指针赋值给相同的字符串时,他们其实会指向同一个地址。spa

char str1[] = "hello";
char str2[] = "hello";
//str1和str2是两个字符串数组,分别开辟了不一样的空间,因此str1和str2不一样

char* str3 = "hello";
char* str4 = "hello";
//str3和str4是两个指针,无需分配内存以存储字符串内容,只要将其指向“hello”的地址便可。

String对象一旦被建立就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操做都会生成新的对象。线程

 

字符串常量池:指针

每当咱们建立字符串常量时,JVM会首先检查字符串常量池,若是该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。若是字符串不存在常量池中,就会实例化该字符串而且将其放到常量池中。因为String字符串的不可变性咱们能够十分确定常量池中必定不存在两个相同的字符串。code

String a = "chenssy";
String b = "chenssy";

String c = new String("chenssy");

a、b和字面上的chenssy都是指向JVM字符串常量池中的"chenssy"对象,他们指向同一个对象。
new关键字必定会产生一个对象chenssy(注意这个chenssy和上面的chenssy不一样),同时这个对象是存储在堆中。因此上面应该产生了两个对象:保存在栈中的c和保存堆中chenssy。可是在Java中根本就不存在两个彻底如出一辙的字符串对象。故堆中的chenssy应该是引用字符串常量池中chenssy。因此c、chenssy、池chenssy的关系应该是:c--->chenssy--->池chenssy。整个关系以下:对象

 

练习:替换空格(合并数组等须要屡次更改大量数据位置的问题,能够考虑使用指针从后向前查找。

3.链表

链表是一种动态数据结构,在建立时不须要将所有的内存进行分配。空间效率比数组高。
练习:单链表的插入删除,链表倒序输出。

4.树

根节点没有父节点,其余都有惟一父节点。叶节点没有子节点,其余都有一个或者多个子节点。父节点和子节点以前用指针链接。

二叉树

二叉树的遍历:前序遍历,中序遍历,后序遍历(以访问根节点的顺序决定。)
二叉搜索树:根节点总比左节点大,而右节点总比根节点大。
堆:最大堆中,根节点的值最大。最小堆中根节点的值最小。

5.栈和队列

栈是一种先进后出的结构,系统为每一个线程通常都会建立一个栈用来存放函数调用时候都各个函数的参数、返回地址和零时变量等等。
一般栈不考虑排序,寻找时候都须要花费O(n)的时间复杂度。

队列是一种先进先出的结构。宽度遍历树的时候,能够利用队列的结构,用来存放每一层的子节点,而后下一层依次遍历子节点。

相关文章
相关标签/搜索