一、稀疏数组
通过一组实例讲解:
*转为稀疏数组的意义:
代码实现:
package sparsearray;
import java.io.*;
import java.lang.reflect.Array;
/**
* @author ZJX
* @create 2021- 05 -27 -10:24
*/
public class SparseArray {
public static void main(String[] args) throws IOException {
// //存入文件
// String str = "G:/sparse3.txt";
// File file = new File(str);
// FileWriter fileWriter = new FileWriter(str);
//创建一个二维数组存取棋盘
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
// 输出原始的二维数组
//
System.out.println("原始二维数组!");
System.out.println("********************");
for(int[] row:chessArr1){
for (int data:row){
// fileWriter.write(data+"\t");
System.out.printf("%d\t", data);
}
// fileWriter.write("\r\n");
System.out.println();
}
System.out.println("********************");
// fileWriter.close();
// System.out.println("输入成功");
int count=0;
for(int[] row:chessArr1){
for (int data:row){
if (data!=0){
count++;
}
}
}
//读取文件
// System.out.println("**********************************");
// BufferedReader in = new BufferedReader(new FileReader(file));
// int sparseArr2[][] = new int[11][11];
// int row2 = 0;
// String line;
// while( (line = in.readLine())!= null) {
// String[] temp = line.split("\t");
// for(int i = 0;i < temp.length;i++) {
// sparseArr2[row2][i] = Integer.parseInt(temp[i]);
// }
// row2++;
// }
// for(int row3[] : sparseArr2) {
// for(int data : row3) {
// System.out.printf("%d\t",data);
// }
// System.out.printf("\n");
// }
//
// System.out.println("**********************************");
System.out.println();
System.out.println();
System.out.println();
//转换为稀疏数组
int[][] sparseArr = new int[count + 1][3];
sparseArr[0][0]=chessArr1[0].length;
sparseArr[0][1]=chessArr1.length;
sparseArr[0][2]=count;
int countNum=0;
System.out.println("转为稀疏数组!");
// System.out.println("**********************************");
for (int i=0;i<chessArr1.length;i++){
for (int j=0;j<chessArr1[0].length;j++){
if(chessArr1[i][j]!=0){
countNum++;
sparseArr[countNum][0]=i;
sparseArr[countNum][1]=j;
sparseArr[countNum][2]=countNum;
}
}
}
System.out.println("**********************************");
for(int[] row:sparseArr){
for (int data:row){
System.out.printf("%d\t", data);
}
System.out.println();
}
System.out.println("**********************************");
System.out.println();
System.out.println();
//再次转换为普通数组
System.out.println("稀疏数组再次转为普通数组");
System.out.println("**********************************");
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i=1;i<sparseArr.length;i++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
System.out.println();
for(int[] row:chessArr2){
for (int data:row){
System.out.printf("%d\t", data);
}
System.out.println();
}
System.out.println("**********************************");
}
}
执行结果:
二、队列(重点讲循环队列)
代码如下:
package queue;
import java.util.Scanner;
/**
* @author ZJX
* @create 2021- 05 -27 -16:35
*/
public class CircleArrayQueueDemo {
public static void main(String[] args) {
//测试一把
System.out.println("测试数组模拟环形队列的案例~~~");
// 创建一个环形队列
CircleArrayQueue queue = new CircleArrayQueue(4); //说明设置4, 其队列的有效数据最大是3
char key = ' '; // 接收用户输入
Scanner scanner = new Scanner(System.in);//
boolean loop = true;
// 输出一个菜单
while (loop) {
System.out.println("s(show): 显示队列");
System.out.println("e(exit): 退出程序");
System.out.println("a(add): 添加数据到队列");
System.out.println("g(get): 从队列取出数据");
System.out.println("h(head): 查看队列头的数据");
key = scanner.next().charAt(0);// 接收一个字符
switch (key) {
case 's':
queue.showQueue();
break;
case 'a':
System.out.println("输出一个数");
int value = scanner.nextInt();
queue.addQueue(value);
break;
case 'g': // 取出数据
try {
int res = queue.getQueue();
System.out.printf("取出的数据是%d\n", res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case 'h': // 查看队列头的数据
try {
int res = queue.headQueue();
System.out.printf("队列头的数据是%d\n", res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case 'e': // 退出
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出~~");
}
}
class CircleArrayQueue {
private int maxSize;//表示数组的最大容量
private int front;//队尾,直接指向头部,指向第一个元素,默认值为0
private int rear;//队尾,指向最后一个元素的后一个位置,默认值为0
private int[] arr;
//初始化
public CircleArrayQueue(int arrMaxSize) {
maxSize = arrMaxSize;
arr = new int[arrMaxSize];
}
//判断队列是否满
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
//判断队列是否为空
public boolean isEmpty() {
return rear == front;
}
//进队列
public void addQueue(int value) {
//判断是否满了
if (isFull()) {
System.out.println("队列已经满了!");
return;
}
arr[rear] = value;
// 因为rear指向最后一个元素的后一个元素
rear = (rear + 1) % maxSize;
}
//出队列
public int getQueue() {
//判断是否为空
if (isEmpty()) {
throw new RuntimeException("队列是空的");
}
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
// 显示队列的所有数据
public void showQueue() {
if (isEmpty()) {
System.out.println("队列是空的!");
return;
}
for (int i = front; i < front + getSize(); i++) {
System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
}
}
//队列总个数
public int getSize() {
return (rear + maxSize - front) % maxSize;
}
//获取头部信息
public int headQueue(){
//判断是否为空
if (isEmpty()) {
throw new RuntimeException("队列是空的");
}
return arr[front];
}
}