更新ing,最近更新时间:2021.4.1
数据结构
稀疏数组
指的是将无效数据量远大于有效数据量的二维数组进行压缩。
package DataStructure;
import java.sql.SQLOutput;
public class SparseArray {
public static void main(String[] args) {
int chessArr1[][]=new int[11][11];//原始数组
chessArr1[1][2]=1;
chessArr1[2][3]=2;
chessArr1[8][6]=1;
System.out.println("原始的二维数组:");
for (int row[]:chessArr1){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println("\n");
}
int sum=0,count=0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
sum++;
}
}
}
System.out.println("转变之后的稀疏数组如下:");
int SparseArray[][]=new int[sum+1][3];//稀疏数组
SparseArray[0][0]=11;
SparseArray[0][1]=11;
SparseArray[0][2]=sum;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
count++;
SparseArray[count][0]=i;
SparseArray[count][1]=j;
SparseArray[count][2]=chessArr1[i][j];
}
}
}
for(int i=0;i<SparseArray.length;i++){
System.out.printf("%d\t%d\t%d\t\n",SparseArray[i][0],SparseArray[i][1],SparseArray[i][2]);
}
//复原数组
int chessArr2[][]=new int[SparseArray[0][0]][SparseArray[0][1]];
for(int i=1;i<SparseArray.length;i++){
chessArr2[SparseArray[i][0]][SparseArray[i][1]] = SparseArray[i][2];
}
System.out.println("恢复后的数组:");
for (int row[]:chessArr2){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println("\n");
}
}
}
循环队列
数组实现
package DataStructure;
import java.sql.SQLOutput;
import java.util.Scanner;
public class CircularArrayQueue {
public static void main(String[] args) {
Circular circular = new Circular(6);
System.out.println("输入a添加数据进入队列");
System.out.println("输入s展示队列");
System.out.println("输入o取出一个数据");
System.out.println("输入h查看队首数据");
Scanner scanner=new Scanner(System.in);
boolean loop=true;
while (loop){
int key=scanner.next().charAt(0);
try{
switch (key){
case 'a':
System.out.println("输入一个数:");
int value=scanner.nextInt();
circular.add(value);
System.out.println("添加成功!");
break;
case 's':
circular.show();
break;
case 'o':
System.out.println("取出的数据是:"+circular.out());;
break;
case 'h':
circular.Front();
break;
case 'e':
scanner.close();
loop=false;
break;
default:
break;
}
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
}
class Circular {
int front;
int rear;
int[] array;
int maxsize;
public Circular(int a) {
maxsize = a;
array = new int[maxsize];
}
public boolean isEmpty() {
return rear == front;
}
public boolean isFull() {
return (rear + 1) % maxsize == front;
}
public void add(int n) {
if (isFull()) {
throw new RuntimeException("队列满,不能添加数据");
}
array[rear] = n;
rear = (rear + 1) % maxsize;//关键语句;
}
public int out() {
if (isEmpty()) {
throw new RuntimeException("队列为空,没有数据可以出");
}
int n = array[front];
front = (front + 1) % maxsize;
return n;
}
public int size() {
return (rear + maxsize - front) % maxsize;
}
public void show() {//显示队列
if (isEmpty()) {
System.out.println("队列为空,没有数据");
return;
}
System.out.println("队列为:");
for (int i = front; i < front + size(); i++) {
System.out.println(array[i]);
}
}
public int Front() {
if (isEmpty()){
throw new RuntimeException("队列为空,没有队首数据");
}
return array[front];
}
}
单链表
可以按照一个value的顺序存储
package DataStructure.LinkedList;
public class SingleList {
public static void main(String[] args) {
Node a = new Node(1, "陈");
Node b = new Node(2, "范");
Node c = new Node(3, "卢");
Node d = new Node(4, "胡");
list List = new list();
List.addbyorder(c);
List.addbyorder(a);
List.addbyorder(d);
List.addbyorder(b);
List.listview();
Node e = new Node(5, "卢*");
List.update(e);
List.listview();
List.delete(3);
List.listview();
}
}
class Node {
public int number;
public String name;
public Node next;
public Node(int number, String name) {
this.name = name;
this.number = number;
}
@Override
public String toString() {
return "学号:" + number + ",姓名:" + name;
}
}
class list {
private Node head = new Node(0, "");
public void add(Node node) {
Node temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
}
public void addbyorder(Node node){//按照number序号添加
Node temp=head;
while (true){
if (temp.next==null){
break;
}else if (temp.next.number>node.number){
break;
}else if (temp.next.number==node.number){
System.out.println("当前学号的学生已存在!");
}
temp=temp.next;
}
node.next=temp.next;
temp.next=node;
// boolean flag=false;
// while (true){
// if (temp.next==null){
// break;
// }
// if (temp.next.number>node.number){
// break;
// }else if (temp.next.number==node.number){
// flag=true;
// break;
// }
// temp=temp.next;
// }
// if (flag){
// System.out.println("当前学号为"+node.number+"的学生已存在!");
// }else {
// node.next = temp.next;
// temp.next = node;
// }
}
public void update(Node node) {
Node temp = head;
// while(true) {
// if (temp.next == null) {
// System.out.println("链表为空,修改失败");
// } else if (temp.next.number == node.number) {
// temp.next.name = node.name;
// break;
// }
// temp = temp.next;
// }
boolean flag=false;
while(true) {
if (temp.next == null) {
break;
} else if (temp.next.number == node.number) {
flag=true;
break;
}
temp = temp.next;
}
if (flag){
temp.next.name = node.name;
}else {
System.out.println("没有找到该学号学生!");
}
}
public void delete(int number){
Node temp=head;
boolean flag=false;
while (true){
if (temp.next==null){
break;
}else if (temp.next.number==number){
flag=true;
break;
}
temp=temp.next;
}
if (flag){
temp.next=temp.next.next;
System.out.println("修改成功");
}else {
System.out.println("没有找到要删除的学生学号!");
}
}
public void listview() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
Node temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
输出:
学号:1,姓名:陈
学号:2,姓名:范
学号:3,姓名:卢
学号:4,姓名:胡
没有找到该学号学生!
学号:1,姓名:陈
学号:2,姓名:范
学号:3,姓名:卢
学号:4,姓名:胡
修改成功
学号:1,姓名:陈
学号:2,姓名:范
学号:4,姓名:胡
单向循环链表
也是解决著名约瑟夫问题的一种方法:
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
在这里插入代码片
双向链表
和单链表差不多的形式,只是添加了一个指向前节点的指针
package DataStructure.LinkedList;
public class DoubleLinkedList {
public static void main(String[] args) {
DoubleNode a = new DoubleNode(1, "陈");
DoubleNode b = new DoubleNode(2, "范");
DoubleNode c = new DoubleNode(3, "卢");
DoubleNode d = new DoubleNode(4, "胡");
Doublelist doublelist = new Doublelist();
//添加到链表里面
doublelist.addbyorder(c);
doublelist.addbyorder(a);
doublelist.addbyorder(d);
doublelist.addbyorder(b);
doublelist.listview();
DoubleNode e = new DoubleNode(2, "范");
doublelist.update(e);//更改
doublelist.listview();
doublelist.delete(3);//删除
doublelist.listview();
}
}
class Doublelist {
private DoubleNode head = new DoubleNode(0, "");
public DoubleNode getHead() {
return head;
}
public void add(DoubleNode doubleNode) {//直接添加
DoubleNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = doubleNode;
doubleNode.pre = temp;
}
public void addbyorder(DoubleNode doubleNode) {//按照number序号添加
DoubleNode temp = head;
while (true) {
if (temp.next == null) {
break;
} else if (temp.next.number > doubleNode.number) {
break;
} else if (temp.next.number == doubleNode.number) {
System.out.println("当前学号的学生已存在!");
}
temp = temp.next;
}
if (temp.next != null) {
doubleNode.next = temp.next;
temp.next.pre = doubleNode;
}
temp.next = doubleNode;
doubleNode.pre = temp;
}
public void update(DoubleNode doubleNode) {
DoubleNode temp = head;
boolean flag=false;
while(true) {
if (temp.next == null) {
break;
} else if (temp.next.number == doubleNode.number) {
flag=true;
break;
}
temp = temp.next;
}
if (flag){
temp.next.name = doubleNode.name;
System.out.println("修改成功!");
}else {
System.out.println("没有找到该学号学生!");
}
}
public void delete(int number) {
DoubleNode temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;
} else if (temp.number == number) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
if(temp.next!=null){
temp.next.pre=temp.pre;
temp.pre.next=temp.next;
System.out.println("修改成功");
}else {
temp.pre.next=null;
System.out.println("修改成功");
}
} else {
System.out.println("没有找到要删除的学生学号!");
}
}
public void listview() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
DoubleNode temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
class DoubleNode {
public int number;
public String name;
public DoubleNode next;
public DoubleNode pre;
public DoubleNode(int number, String name) {
this.name = name;
this.number = number;
}
@Override
public String toString() {
return "学号:" + number + ",姓名:" + name;
}
}
输出结果:
学号:1,姓名:陈
学号:2,姓名:范
学号:3,姓名:卢
学号:4,姓名:胡
修改成功!
学号:1,姓名:陈
学号:2,姓名:范
学号:3,姓名:卢
学号:4,姓名:胡
修改成功
学号:1,姓名:陈
学号:2,姓名:范
学号:4,姓名:胡