数据结构与算法(Java)之稀疏数组与队列
Posted 达少Rising
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法(Java)之稀疏数组与队列相关的知识,希望对你有一定的参考价值。
稀疏数组
package com.weeks.sparsearray;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author 达少
* @version 1.0
* 系数数组和二维数组之间的转换
*/
public class SparseArray {
public static void main(String[] args) {
int[][] chessArray = new int[11][11];
chessArray[1][2] = 1;
chessArray[2][3] = 2;
chessArray[10][10] = 2;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
System.out.print(chessArray[i][j] + "\\t");
}
System.out.println();
}
int[][] sparseArray = chessArrayToSparseArray(chessArray);
System.out.println("稀疏数组:");
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\\t%d\\t%d\\n", sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
System.out.println("从稀疏数组恢复的二维数组:");
int[][] new_chessArray = sparseArrayToChessArray(sparseArray);
for (int i = 0; i < new_chessArray.length; i++) {
for (int j = 0; j < new_chessArray[i].length; j++) {
System.out.print(new_chessArray[i][j] + "\\t");
}
System.out.println();
}
//将系数数组保存到map.data文件
saveSparseArrayToFile(sparseArray);
//从map.data读取数据到稀疏数组中
int[][] new_sparseArray = readFileToSparseArray();
System.out.println("读取到的稀疏数组:");
for (int i = 0; i < new_sparseArray.length; i++) {
System.out.printf("%d\\t%d\\t%d\\n", new_sparseArray[i][0],new_sparseArray[i][1],new_sparseArray[i][2]);
}
}
//将二维数组转换为稀疏数组
public static int[][] chessArrayToSparseArray(int[][] chessArray){
if(chessArray == null) {
return null;
}
//获得行数和列数
int rows = chessArray.length;
int cols = chessArray[0].length;
//遍历二维数组获取非零元素的个数
int notZeros = 0;
for(int[] row : chessArray){
for(int col : row){
if (col != 0){
notZeros++;
}
}
}
//根据rows, cols, notZeros构建稀疏数组
int[][] sparseArray = new int[notZeros + 1][3];
//将二维数组的行列数和非零元素个数记录到稀疏数组中的第一行
sparseArray[0][0] = rows;
sparseArray[0][1] = cols;
sparseArray[0][2] = notZeros;
//再次遍历二维数组将非零元素的行列和值信息记录到稀疏数组中
int count = 1;//记录下一个数应该填到稀疏数组中哪一行
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
if (chessArray[i][j] != 0){
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArray[i][j];
count++;
}
}
}
return sparseArray;
}
//将系数数组转换为二维数组
public static int[][] sparseArrayToChessArray(int[][] sparseArray){
if(sparseArray == null){
return null;
}
//获取二维数组的行和列,元素个数
int rows = sparseArray[0][0];
int cols = sparseArray[0][1];
//构建二维数组
int[][] chessArray = new int[rows][cols];
//遍历系数数组,将元素写到二维数组的对应位置
for (int i = 1; i < sparseArray.length; i++) {
chessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return chessArray;
}
//将稀疏矩阵保存到map.data文件中
public static void saveSparseArrayToFile(int[][] sparseArray){
BufferedWriter buf = null;
try {
buf = new BufferedWriter(new FileWriter("map.data"));
for (int i = 0; i < sparseArray.length; i++) {
buf.write(Arrays.toString(sparseArray[i]));
buf.newLine();
}
buf.flush();
} catch (IOException e) {
throw new RuntimeException(e);//抛出运行时异常,方便调用方捕获,进行处理
} finally {
try {
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//从map.data中读取数据到系数数组中
public static int[][] readFileToSparseArray(){
BufferedReader buf = null;
List<Integer> list = new ArrayList<>();
int[][] sparseArray = null;
try {
buf = new BufferedReader(new FileReader("map.data"));
String line = null;
while((line = buf.readLine())!= null){
line = line.substring(1,line.length()-1);
String[] split = line.split(",");
for (int i = 0; i < split.length; i++) {
list.add(Integer.parseInt(split[i].trim()));
}
}
int rows = list.get(2)+1;
sparseArray = new int[rows][3];
for (int i = 0; i < sparseArray.length; i++) {
sparseArray[i][0] = list.get(i * 3);
sparseArray[i][1] = list.get((i * 3) + 1);
sparseArray[i][2] = list.get((i * 3) + 2);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sparseArray;
}
}
队列
使用数组实现
非环形队列
package com.weeks.queue;
import java.util.Scanner;
/**
* @author 达少
* @version 1.0
* 模拟数组作为队列,存在空间不能复用的问题
*/
public class ArrayQueueDemo {
public static void main(String[] args) {
//创建队列
ArrayQueue queue = new ArrayQueue(3);
char key = ' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while(loop){
System.out.println("\\n操作菜单说明:\\n" +
"1 (put) 向队列添加数据\\n" +
"2 (pop) 从队列中取出数据\\n" +
"3 (list) 显示队列的所有元素\\n" +
"4 (getH) 显示头元素\\n" +
"5 (exit) 退出程序\\n");
System.out.print("请输入你的选择:");
key = scanner.next().charAt(0);
switch (key){
case '1':
System.out.print("请输入一个整数:");
int num = scanner.nextInt();
queue.put(num);
break;
case '2':
try {
int popNum = queue.pop();
System.out.printf("从队列中取出的数据为:%d", popNum);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case '3':
try {
queue.listQueue();
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case '4':
try {
int frontElement = queue.getFrontElement();
System.out.println("队列的头部元素是:" + frontElement);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case '5':
System.out.println("退出程序~~~");
loop = false;
scanner.close();
break;
default:
break;
}
}
}
}
class ArrayQueue {
//定义用数组模拟队列时该有的属性
private int maxSize;//数组的容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//实现队列的数组
//在构造函数中初始化队列
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
this.front = -1;//指向队列首元素的前一个位置
this.rear = -1;//指向队列的最后一个元素
this.arr = new int[maxSize];
}
//判断队列是否为满
public boolean isFull() {
//满的条件是rear为arr的最大下标
return rear == (maxSize - 1);
}
//判断队列是否为空
public boolean isEmpty() {
//为空的条件就是rear = front
return rear == front;
}
//添加元素到队列中
public void put(int element) {
//先判断队列是否满
if (isFull()) {
System.out.println("队列已满,不能添加元素!");
return;
}
//添加元素
arr[++rear] = element;
}
//从队列中取出一个元素
public int pop() {
//判断队列是否为空
if (isEmpty()) {
//抛出异常
throw new RuntimeException("队列为空,没有元素可以取出!");
}
return arr[++front];
}
//遍历显示队列所有元素
public void listQueue() {
//判断队列是否为空
if (isEmpty()) {
throw new RuntimeException("队列为空,不可遍历!");
}
for (int i = 0; i < arr.length; i++) {
System.out.printf("arr[%d]=%d\\n", i, arr[i]);
}
}
//返回队列的头部元素,注意不是取出头部元素
public int getFrontElement() {
if (isEmpty(数据结构与算法(Java版) | 稀疏数组的应用场景