引言
数据结构=数据+结构。所以数据结构是一个抽象的概念。其目的是为了更好的组织数据方便数据存储。下面我们来看一些简单的数据储存方式
输入和输出
这里先介绍java的输入和输出。简单引入,不过多详细介绍,等我单一写一篇的时候这里会挂上链接
简单的就是Scanner,使用方法如下:
Scanner scan = new Scanner(System.in);//引包记得用ctrl+shift+o,不引包会报错的
放我们获取键盘输入的时候,可查看一下用法:
int a = scan.nextInt();//从键盘获取一个数字
String b = scan.next();//从键盘获取一个字符串
//多个数字或者字符串了可以用空格分隔,也可以用换行符分割
输出就是:
System.out.println();//ln为换行输出,不加ln就可以不换行输出。有心情就自己去试
数组
数组是 我们常见的一个简单的数据结构,其引用方式为:
数据类型[] 数组名 = new 数据类型[size];//size为数组的大小,记得替换为数字
引入数组知识–下标:下标是为了查找数据的,因为我们储存过多的数据,所以利用下标来进行元素的访问的,第i个数的下标为i-1。
其次每个数组只能存放单一的元素,一个数据只能储存一种类型的元素。
实例:
int[] arr = new int[10];//创建一个有10个数字元素数组
String[] arr = new String[10];//创建一个有10个字符元素的数组
看到这里是不是觉得有点空,拿来看一道简单的题目吧;
- 从键盘获取10个数字并输出
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] a = new int[10];//引入数组用来存储数据
for (int i = 0;i<10;i++){
a[i]= scan.nextInt();//利用for循环来多次读入数据
}
for (int i = 0; i < 10; i++) {
System.out.println(a[i]);//for循环遍历数据输出
}
}
}
二维数组
二维数组就是一维数组的扩展,其实例化方式为
数据类型[][] 数组名 = new 数据类型[size][size];//size大小
实例:
int[][] arr = new int[10][10];
char[][] chars = new char[10][10];
说到了二维数组,那这里就不得不提到Arrays函数了。Arrays函数提供了一种转换数组的功能。下边看
实例
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String b= scan.next();
char[] chars =b.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i] + " ");
}
}
}
这个操作也可以用到二维数组的读入中,大家可以自己尝试,不能再多说了,在多说就想把这就该改为付费内容了
List
list集合其实是一个可变长度的数组。应用于我们存储的数据量未知的情况,也就是数组不知道怎么开空间的时候.
语法格式
List<Integer> list = new LinkedList();//Integer是int的封装类行,<>中就是代表集合的数据类型,不过这里要用封装类型
List<Integer> list1 = new ArrayList<>();//也可以用这个,具体一个是链表实现,一个是数组实现
相关操作
数组我们没有细说储存,细说牵扯的就比较多了。数组我们是开辟了一片空间通过下标来储存对应的元素,而链表是我们开辟了一个头节点,然后通过增/删的操作来加长/减短链表的大小。看图:
函数 | 作用 |
---|---|
add(value) | 添加元素 |
remove(index) | 删除元素 |
isEmpty | 判断集合是否为空 |
contains(value) | 是否包含该元素 |
size | 返回几个元素个数 |
get(index) | 获取元素 |
相关例题
Set(集合)
上边我们说了list集合,set集合和list集合都是用来存储的,其差异在与set集合不会储存重复元素,也就是说其元素存在唯一性。
实现
Set<Integer> set = new HashSet();//依旧Integer代表的是封装数据类型
相关操作
函数 | 作用 |
---|---|
add(value) | 添加元素 |
remove(index) | 删除元素 |
contains(value) | 是否包含该元素 |
size | 返回几个元素个数 |
clear | 清空元素 |
相关例题
给出n个数字,请问其中不重复的数字有几个
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Set_collect {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Set<Integer> set = new HashSet<>();
int n = scan.nextInt();//获取输入的数字个数n
for (int i = 0; i < n; i++) {//进行n次循环
int tmp = scan.nextInt();//获取数字
set.add(tmp);//将获取的数字加入到set集合中
}
System.out.println(set.size());
}
}
样例:
Map(键值)
Map集合是一种特殊的集合,其储存方式为key-value形式,就像字典那样每一个拼音下边都很多汉字
实现
Map<Integer,Integer> map = new HashMap<>();//Integer依旧为封装数据类型,可替换
相关操作
函数 | 作用 |
---|---|
put(key,value) | 添加元素 |
get(key) | 获取与key对应的value值 |
size() | 返回几个元素个数 |
entrySet | 将map集合转化成为一个set集合,方便遍历 |
getOrdefault(key,value) | 获取指定的key和value,没有则返回默认值 |
相关例题
输入n个数据,统计其重复个数,最后输出;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class list_map {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Map<Integer,Integer> map = new HashMap<>();
int n = scan.nextInt();
for (int i = 0; i < n; i++) {
int tmp = scan.nextInt();
if (map.containsKey(tmp)&!map.isEmpty()){
map.put(tmp, map.get(tmp)+1);
}else {
map.put(tmp,1);
}
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}
代码运行结果
Stack(栈)
栈是一个比较熟悉的词,下边简单解释,它是只允许在一段进行插入和删除的线性表,只能在一端进行插入和删除,就以为这最先进入的元素会最后出来,这也对应了栈的特点,先进后出。
相关操作
函数 | 作用 |
---|---|
push(value) | 添加元素 |
pop() | 删除栈顶元素 |
peek() | 返回栈顶元素,但不删除 |
isEmpty | 判断是否为空 |
相关例题
Queue(队列)
队列与栈有所不同,栈是只能在一端插入和删除,而队列是一头出一头进,你也可以理解成为耳朵出右耳朵进。这也对应了其特点:先进先出
相关操作
函数 | 作用 |
---|---|
add(value) | 添加元素 |
poll() | 删除队头元素 |
peek() | 返回队头元素,但不删除 |
isEmpty | 判断是否为空 |