1.稀疏数组
为了节约空间,引入了稀疏数组!
在一些二维数组中,如果有很多的无效数据,那么转化为稀疏数组无疑是一个好的选择!
package SparseArray;
//稀疏数组
public class SparseArrayDemo {
//二维数组转稀疏数组
public static void main(String[] args) {
int sum = 0;
int[][] arr = new int[10][10];
arr[0][1] = 3;
arr[3][8] = 7;
for (int x[]:arr){
for (int y:x){
sum++;
System.out.printf("%d\t",y);
if (sum % 10 == 0){
System.out.println();
}
}
}
int number = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length ; j++) {
if (arr[i][j] != 0 ){
number++;
}
}
}
//将二维数组转化为稀疏数组
int sparseArray[][] = new int[number+1][3];
sparseArray[0][0] = number;
sparseArray[0][1] = 11;
sparseArray[0][2] = 11;
int s = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length ; j++) {
if (arr[i][j] != 0 ){
sparseArray[s][0] = arr[i][j];
sparseArray[s][1] = i;
sparseArray[s][2] = j;
s++;
}
}
}
System.out.println();
int num = 0;
for (int x[]:sparseArray){
for (int y:x){
num++;
System.out.printf("%d\t",y);
if (num % 3 == 0){
System.out.println();
}
}
}
//将稀疏数组转化为二维数组
int newArray[][] = new int[sparseArray[0][1]][sparseArray[0][2]];
for (int i = 1; i < sparseArray.length; i++) {
for (int j = 0; j < 3 ; j++) {
newArray[sparseArray[i][1]][sparseArray[i][2]] = sparseArray[i][0];
}
}
int m = 0;
System.out.println();
for (int x[]:newArray){
for (int y:x){
m++;
System.out.printf("%d\t",y);
if (m % newArray[0].length == 0){
System.out.println();
}
}
}
}
}
2.队列
队列遵循的标准是先进先出,后进后出!
第一种是直接使用数组,但是这种方法有弊端,即只能使用一次,不能循环使用
package Queue;
/**
* 队列:有序列表
* 遵循先入先出:即先存的先取出,后存的后取出
* 但是现阶段的数组存在问题,只能用一次就不能再用了
*/
public class queue {
public static void main(String[] args) {
queues queues = new queues(5);
queues.addqueue(3);
queues.addqueue(4);
queues.addqueue(2);
queues.addqueue(11);
queues.showFirstQueue();
}
}
//数组模似队列
class queues{
public int Maxsize; //队列的最大容量
public int front = -1; //指向队列最前列的前一个位置
public int reas = -1; //指向队列最后一个位置
public int arr[];
public queues(int maxsize){
Maxsize = maxsize;
arr = new int[Maxsize];
}
public boolean IsEmpty(){ //判断是否为空
return reas == front;
}
public boolean IsFull(){ //判断是否已满
return reas == Maxsize - 1;
}
public void addqueue(int number){ //添加数据
if (IsFull()){
System.out.println("队列已经满了,不能添加");
return;
}
reas++;
arr[reas] = number;
}
public void getQueue(){ //取出数据,并且把前指针向后移一个单位
if (IsEmpty()){
System.out.println("队列为空,无数据");
return;
}
front++;
System.out.println(arr[front]);
}
public void showQueue(){ //展示所有数据
if (IsEmpty()){
System.out.println("队列为空,无数据");
return;
}
for (int x = 0 ; x <= reas;x++) {
System.out.println(arr[x]);
}
}
public void showFirstQueue(){
if (IsEmpty()){
System.out.println("队列为空,无数据");
return;
}
System.out.println(arr[front + 1]);
}
}
第二种就是使用环形数组,但是这种方法会牺牲一个空间,具体的看代码
package Queue;
import java.util.Scanner;
public class RingQueue {
public static void main(String[] args) {
RingQueues ringQueues = new RingQueues(3);
boolean loop =true;
//菜单
while (loop){
System.out.println("a(add)");
System.out.println("g(get)");
System.out.println("s(show)");
System.out.println("f(first)");
System.out.println("e(exit)");
Scanner s = new Scanner(System.in);
char ls = s.next().charAt(0);
switch (ls){
case 'a':
System.out.println("请输入插入的数:");
int sum =s.nextInt();
ringQueues.addqueue(sum);
break;
case 'g':
ringQueues.getQueue();
break;
case 's':
ringQueues.showQueue();
break;
case 'f':
ringQueues.showFirstQueue();
break;
case 'e':
loop = false;
break;
}
}
}
}
class RingQueues{
public int Maxsize; //队列的最大容量
public int front = 0; //指向队列最前列的位置
public int reas = 0; //指向队列最后一个位置的后一个位置
public int arr[];
public RingQueues(int maxsize){
Maxsize = maxsize;
arr = new int[Maxsize];
}
public boolean IsEmpty(){ //判断是否为空
return reas == front;
}
public boolean IsFull(){ //判断是否已满
return (reas+ 1) % Maxsize == front;
}
public void addqueue(int number){ //添加数据
if (IsFull()){
System.out.println("队列已经满了,不能添加");
return;
}
arr[reas] = number;
reas = (reas + 1) % Maxsize;
}
public void getQueue(){ //取出数据,并且把前指针向后移一个单位
if (IsEmpty()){
System.out.println("队列为空,无数据");
return;
}
System.out.println(arr[front]);
front = (front + 1) % Maxsize;
}
public void showQueue(){ //展示所有数据
if (IsEmpty()){
System.out.println("队列为空,无数据");
return;
}
for (int x = front ; x <= (reas +Maxsize -front) % Maxsize;x++) {
System.out.println(arr[x]);
}
}
public void showFirstQueue(){
if (IsEmpty()){
System.out.println("队列为空,无数据");
return;
}
System.out.println(arr[front]);
}
}
3.单向链表
package List;
public class SingleLinkedListDemo {
public static void main(String[] args) {
SingleLinkedList list = new SingleLinkedList();
list.AddByOrder(new HeroList(1,"李坤","黑旋风"));
list.AddByOrder(new HeroList(4,"鲁智深","花和尚"));
list.AddByOrder(new HeroList(2,"吴用","及时雨"));
list.AddByOrder(new HeroList(3,"毛概","朱芊"));
list.ShowList();
list.Updata(new HeroList(3,"龚雷","大朋友"));
list.ShowList();
list.Delete(new HeroList(1,"",""));
list.ShowList();
}
}
class SingleLinkedList{
public HeroList head = new HeroList(0,"","");
//该方法是直接添加到末尾,不是按照序号
public void AddList(HeroList heroList){
HeroList demo = head;
while (true){
if (demo.next == null){
demo.next = heroList;
break;
}
demo = demo.next;
}
}
public void Delete(HeroList heroList){
if (head.next == null){
System.out.println("链表为空!");
return;
}
boolean flag = false;
HeroList demo = head;
while (true){
if (demo.next == null){
return;
}
else if (heroList.no == demo.next.no){
flag = true;
break;
}
demo = demo.next;
}
if (flag){
demo.next = demo.next.next;
}
else {
System.out.println("排名未查到");
}
}
public void Updata(HeroList newHerolist){
if (head.next == null){
System.out.println("链表为空,不能更新");
return;
}
HeroList demo = head;
boolean flag = false;
while (true){
if (demo.next == null){
break;
}
else if (demo.no == newHerolist.no){
flag = true;
break;
}
demo = demo.next;
}
if (flag){
demo.name = newHerolist.name;
demo.Nickname = newHerolist.Nickname;
}
else {
System.out.println("输入的排名未查到!");
}
}
//根据序号来添加
public void AddByOrder(HeroList heroList){
HeroList demo = head;
boolean flag = false;
while (true){
if (demo.next == null){
break;
}
else if (demo.next.no == heroList.no){
flag = true;
break;
}
else if (demo.next.no > heroList.no){
break;
}
demo = demo.next;
}
if (flag){
System.out.println("英雄的排名已经存在,不能加入!");
}
else {
heroList.next = demo.next;
demo.next = heroList;
}
}
public void ShowList(){
if (head.next == null){
System.out.println("链表为空,没有数据");
return;
}
HeroList demo1 = head.next;
while (true){
if (demo1 == null){
break;
}
System.out.println(demo1);
demo1 = demo1.next;
}
}
}
class HeroList{
public int no;
public String name;
public String Nickname;
public HeroList next;
public HeroList(int no, String name, String nickname) {
this.no = no;
this.name = name;
Nickname = nickname;
}
@Override
public String toString() {
return "HeroList{" +
"no=" + no +
", name='" + name + '\'' +
", Nickname='" + Nickname + '\'' ;
}
}
4.双向链表
双向链表和单向链表唯一的差别就是双向链表有两个指针,一个指向前面,一个指向后面,其他和单向链表无巨大差异
package List;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
DoubleLinkedList demo1 = new DoubleLinkedList();
demo1.AddByOrder(new HeroList1(7,"龚雷","小猪"));
demo1.AddByOrder(new HeroList1(6,"朱芊","小猪"));
demo1.AddByOrder(new HeroList1(5,"熊国成","小熊"));
demo1.AddByOrder(new HeroList1(4,"熊国成","小熊"));
demo1.AddByOrder(new HeroList1(8,"熊国成","小熊"));
demo1.ShowList();
}
}
class DoubleLinkedList{
public HeroList1 head = new HeroList1(0,"","");
/**
* 展示双向链表数据
*/
public void ShowList(){
if (head.next == null){
System.out.println("链表为空,没有数据");
return;
}
HeroList1 demo1 = head.next;
while (true){
if (demo1 == null){
break;
}
System.out.println(demo1);
demo1 = demo1.next;
}
}
/**
* 直接添加到双向链表末尾
* @param heroList
*/
public void AddList(HeroList1 heroList){
HeroList1 demo = head;
while (true){
if (demo.next == null){
demo.next = heroList;
break;
}
demo = demo.next;
}
heroList.pre = demo;
demo.next = heroList;
}
/**
* 依照序号添加
* @param heroList
*/
public void AddByOrder(HeroList1 heroList){
HeroList1 demo = head;
boolean flag = false;
while (true){
if (demo.next == null){
break;
}
else if (demo.next.no == heroList.no){
flag = true;
break;
}
else if (demo.next.no > heroList.no){
break;
}
demo = demo.next;
}
if (flag){
System.out.println("英雄的排名已经存在,不能加入!");
}
else {
if (demo == head && head.next == null){
head.next = heroList;
heroList.pre = head;
heroList.next = null;
return;
}
if (demo == head && head.next != null){
heroList.next = demo.next;
demo.next.pre = heroList;
head.next = heroList;
heroList.pre = head;
return;
}
else if (demo.next == null && head.next != null){
demo.next = heroList;
heroList.pre = demo;
heroList.next = null;
return;
}
demo.next = heroList;
heroList.pre = demo;
heroList.next = demo.next;
demo.next.pre = heroList;
}
}
/**
* 修改双向链表的值
* @param newHerolist
*/
public void Updata(HeroList1 newHerolist){
if (head.next == null){
System.out.println("链表为空,不能更新");
return;
}
HeroList1 demo = head;
boolean flag = false;
while (true){
if (demo.next == null){
break;
}
else if (demo.no == newHerolist.no){
flag = true;
break;
}
demo = demo.next;
}
if (flag){
demo.name = newHerolist.name;
demo.Nickname = newHerolist.Nickname;
}
else {
System.out.println("输入的排名未查到!");
}
}
/**
* 删除节点
* @param heroList
*/
public void Delete(HeroList1 heroList){
if (head.next == null){
System.out.println("链表为空!");
return;
}
boolean flag = false;
HeroList1 demo = head.next;
while (true){
if (demo == null){
return;
}
else if (heroList.no == demo.no){
flag = true;
break;
}
demo = demo.next;
}
if (flag) {
demo.pre.next = demo.next;
if (demo.next != null) { //如果demo为最后一个,会有空指针异常
demo.next.pre = demo.pre;
}
}
else {
System.out.println("排名未查到");
}
}
}
class HeroList1{
public int no;
public String name;
public String Nickname;
public HeroList1 next;
public HeroList1 pre;
public HeroList1() {
}
public HeroList1(int no, String name, String nickname) {
this.no = no;
this.name = name;
Nickname = nickname;
}
@Override
public String toString() {
return "HeroList1{" +
"no=" + no +
", name='" + name + '\'' +
", Nickname='" + Nickname + '\'' ;
}
}
以上知识是自学尚硅谷java数据结构,同时给尚硅谷一个好评!同志们,一起加油!