线性结构
线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
线性机构有两种不同的存储结构,即顺序存储(数组)和链式存储(链表)。
顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的
链式存储的线性表称为链表,链表中的存储元素不一定是连续的
线性结构常见的有:数组、队列、栈和链表。
非线性结构
非线性结构包括:二维数组、多维数组、广义表、树、图
稀疏数组
package com.xhl.sparsearray;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class SparseArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个原始的二维数组
//0:表示没有棋子 1:表示黑子 2: 表示蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
chessArr1[4][5]=2;
//输出原始 的二维数组
System.out.println("原始的二维数组:");
for(int[] row:chessArr1) {
for(int data: row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组转为稀疏数组
//1、先遍历二维数组,得到非0数据个数
int sum = 0;
for(int i=0 ;i<11;i++) {
for(int j = 0;j<11;j++) {
if(chessArr1[i][j]!=0) {
sum++;
}
}
}
//2、创建对应的稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
//遍历二维数组,将非0的值存放到sparseArr中
int count = 0;//用于记录是第几个非0数据
for(int i=0 ;i<11 && count<sum;i++) {
for(int j = 0;j<11 && count<sum;j++) {
if(chessArr1[i][j] !=0) {
count ++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArr1[i][j];
}
}
}
//输出稀疏数组的形式
System.out.println();
System.out.println("得到的稀疏数组为:");
for(int i=0;i< sparseArr.length;i++) {
System.out.printf("%d\t%d\t%d\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
System.out.println();
//将稀疏数组--->恢复成原始的二维数组
/*
* 1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
* 2、在读取稀疏数组的后几行数据,并赋值给二维数组即可
*/
//1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//2、在读取稀疏数组的后几行数据,并赋值给二维数组即可
for(int i=1;i<sparseArr.length;i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
//输出恢复后的二维数组
System.out.println();
System.out.println("恢复后的二维数组为;");
for(int[] row:chessArr2) {
for(int data: row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
运行结果:
课后练习:
- 将稀疏数组保存到磁盘上,文件名map.data
- 读取map.data恢复稀疏数组
知识点:文件及IO流
图中FileReader属于节点流,Reader就是处理流
package com.xhl.sparsearray.homework;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class SparseArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个原始的二维数组
//0:表示没有棋子 1:表示黑子 2: 表示蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
chessArr1[4][5]=2;
//输出原始 的二维数组
System.out.println("原始的二维数组:");
for(int[] row:chessArr1) {
for(int data: row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组转为稀疏数组
//1、先遍历二维数组,得到非0数据个数
int sum = 0;
for(int i=0 ;i<11;i++) {
for(int j = 0;j<11;j++) {
if(chessArr1[i][j]!=0) {
sum++;
}
}
}
//2、创建对应的稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
//遍历二维数组,将非0的值存放到sparseArr中
int count = 0;//用于记录是第几个非0数据
for(int i=0 ;i<11 && count<sum;i++) {
for(int j = 0;j<11 && count<sum;j++) {
if(chessArr1[i][j] !=0) {
count ++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArr1[i][j];
}
}
}
//创建输出流
FileWriter writer = null;
try {
writer = new FileWriter("map.data");
//输出稀疏数组的形式
System.out.println();
System.out.println("得到的稀疏数组为:");
for(int i=0;i< sparseArr.length;i++) {
System.out.printf("%d\t%d\t%d\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
//利用IO流将稀疏数组写入
if (i == sparseArr.length - 1) {
writer.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2]);
}else {
writer.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ",");
}
}
System.out.println();
writer.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//将稀疏数组--->恢复成原始的二维数组
/*
* 1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
* 2、在读取稀疏数组的后几行数据,并赋值给二维数组即可
*/
//1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
FileReader reader = null;
StringBuffer sb = new StringBuffer();
try {
reader = new FileReader("map.data");
while (reader.ready()) {
sb.append((char) reader.read());// 转成char加到StringBuffer对象中
}
System.out.println(sb.toString());
reader.close();// 关闭读取流
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(reader != null) {
reader.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
String[] str = sb.toString().split(",");
int chessArr2[][] = new int[str.length/3][3];
// 给稀疏数组赋值
int i = 0;
for (String s : str) {
chessArr2[(i - (i % 3)) / 3][i % 3] = Integer.parseInt(s);
i++;
}
//输出恢复后的二维数组
System.out.println();
System.out.println("恢复后的二维数组为;");
for(int[] row:chessArr2) {
for(int data: row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
运行结果: