1.什么是数据结构?
编程就是我们使用编程语言来处理特定数据来实现某个目标的过程,其中语句的处理过程就是算法,而数据的组织方式就是数据结构。数据的组织方式当然会影响程序的处理效率,所以针对不同场景需要有针对性地组织数据,即选择合适的数据结构。
2.数据结构有哪些类型?
数据结构可以按照逻辑结构和物理结构来分类。
逻辑是指各个数据之间的关系规则,常见的可分为集合结构(相同类型的数据集)、线性结构(数据之间单线关联)、树形结构(数据之间为一对多关联)、图形结构(数据之间为多对多关联)。
物理结构是指数据的物理存储之间的联系,有顺序存储结构(数据在内存中依次存放)和链式存储结构(数据的物理地址并不相邻,分散各处)。
比如说数组(Array)是一种常见的数据结构,它的各个元素之间是线性关联,在物理内存中也是放在一块连续的空间;栈(Stack)是一种数据呈线性排列的数据结构,它的特点是“先进后出”,像一个弹匣,先存入的元素只能后取出。它们都有各自适用的场景,数组存放相同类型的元素(比如某个科目的成绩),可以做排序等操作;栈可以用来做进制转换、表达式转换等操作。
数组:
栈:
其他的常用数据结构还有:队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等。
队列:
链表:
树:
图:
散列表:
堆:
3.常见数据结构的实现
3.1数组
数组是最常用的一种数据结构,用来存储同一类型值的集合。Java提供的数组类为:java.util.ArrayList。数组的特点是其中的元素可以通过数组下标来访问,下标从0开始:
int[] data = new int[10]; //初始化一个长度为10的整型数组
data[0] = 2; //给第一个元素赋值
data[1] = 4;
int temp = data[1];
System.out.println("temp=" + temp);
数组的特点:
1.取元素快捷,任何位置上的元素都可以直接按下标获取;
2.插入元素复杂,在i位置插入一个元素,则i之后的所有元素都要向后移动一次,若数组内的元素数量巨大,则非常耗时;
3.删除元素与插入类似,删除i位置元素,则它后面的元素都要向前移动一个位置,同样可能非常耗时;
优点:
1.访问元素快;
2.遍历数组方便(循环遍历即可);
缺点:
1.元素多时,数组的插入、删除操作较慢;
2.数组大小固定,无法扩容;
3.数组只能存储一种类型的数据;
适用场景:
查询多而增删少,数据改动不频繁的数据可以用数组存储。
3.2栈
下压栈(或简称栈)是一种基于后进先出(LIFO)策略的集合类型。栈就像一个弹匣,新存入的元素永远在栈的顶端,取元素的时候也是从最后存入的开始取。数据的入栈动作称为压栈,出栈动作称为弹栈。
Java提供的栈类为:java.util.Stack,常用方法如下:
Stack<Character> zh = new Stack<>();
zh.push('w'); //压入‘w’
zh.push('h'); //压入‘h’
System.out.println("栈zh是否为空:"+zh.empty()); //判断栈是否为空
System.out.println("取栈顶元素:"+zh.pop()); //取栈顶元素并从栈中删除
System.out.println("再取一个:"+zh.peek()); //取栈顶元素但不删除
System.out.println("栈zh是否为空:"+zh.empty()); //判空
结果:
栈zh是否为空:false
取栈顶元素:h
再取一个:w
栈zh是否为空:false
应用场景:
数制转换、括号匹配等(后续写具体实现)。
Java提供了常用数据结构的实现,我们也可以用其他方式实现这些数据结构,后续再写其他的数据结构的用法。