数据结构与算法总结
一、稀疏数组
/**
* 稀疏数组相关操作
*/
public class test1 {
public static void main(String[] args) {
//创建一个11*11的二维数组表示棋盘
//0:没有棋子;1黑子;2:白子
int[][] mapArray=new int[11][11];
mapArray[1][2]=1;
mapArray[2][3]=2;
mapArray[4][4]=1;
//打印稀疏数组
System.out.println("二维数组为:");
for(int i=0;i<mapArray.length;i++){
for(int j=0;j<mapArray[0].length;j++){
if(j==mapArray.length-1){
System.out.print(mapArray[i][j]);
}else{
System.out.print(mapArray[i][j]+"\t");
}
}
System.out.println();
}
System.out.println("----------------------------------------");
//将此二维数组转换成稀疏数组
//1、遍历数组,找出特殊数据的个数,用此数据创建稀疏数组
int count=0;
for(int i=0;i<mapArray.length;i++){
for(int j=0;j<mapArray[0].length;j++){
count++;
}
}
//2、创建稀疏数组
int[][] sparseArray=new int[count+1][3];
//3、给稀疏数组
}
/**
* 稀疏数组相关操作
*/
public class test1 {
public static void main(String[] args) {
//创建一个11*11的二维数组表示棋盘
//0:没有棋子;1黑子;2:白子
int[][] mapArray=new int[11][11];
mapArray[1][2]=1;
mapArray[2][3]=2;
mapArray[4][4]=1;
//打印稀疏数组
System.out.println("二维数组为:");
for(int i=0;i<mapArray.length;i++){
for(int j=0;j<mapArray[0].length;j++){
if(j==mapArray[0].length-1){
System.out.print(mapArray[i][j]);
}else{
System.out.print(mapArray[i][j]+"\t");
}
}
System.out.println();
}
System.out.println("--------------------------------------------------");
//将此二维数组转换成稀疏数组
//1、遍历数组,找出特殊数据的个数,用此数据创建稀疏数组
int sum=0;//特殊元素个数
for(int i=0;i<mapArray.length;i++){
for(int j=0;j<mapArray[0].length;j++){
if(mapArray[i][j]!=0) {
sum++;
}
}
}
//2、创建稀疏数组
int[][] sparseArray=new int[sum+1][3];
//3、给稀疏数组赋初值
sparseArray[0][0]=mapArray.length;
sparseArray[0][1]=mapArray[0].length;
sparseArray[0][2]=sum;
//3、遍历数组,将特殊数据放入稀疏数组
int count=0;//记录特殊元素的个数
for(int i=0;i<mapArray.length;i++){
for(int j=0;j<mapArray[0].length;j++){
if(mapArray[i][j]!=0){
count++;
sparseArray[count][0]=i;
sparseArray[count][1]=j;
sparseArray[count][2]=mapArray[i][j];
}
}
}
//二维数组转稀疏数组成功
//输出此次数数组,观察格式
for(int i=0;i<sparseArray.length;i++){
for(int j=0;j<sparseArray[0].length;j++){
if(j==sparseArray[0].length-1){
System.out.print(sparseArray[i][j]);
}else{
System.out.print(sparseArray[i][j]+"\t");
}
}
System.out.println();
}
/**
* 将稀疏数组恢复成二维数组
*/
//1、先读取稀疏数组的第一行,根据此数据创建二维数组
int[][] mapArray2=new int[sparseArray[0][0]][sparseArray[0][1]];
//2、读取稀疏数组第一行之后的数据
for(int i=1;i<sparseArray.length;i++){
mapArray2[sparseArray[i][0]][sparseArray[i][0]]=sparseArray[i][2];
}
//输出恢复之后的数据
System.out.println("-----------------------------------------------------");
System.out.println("恢复后的二维数组:");
for(int i=0;i<mapArray2.length;i++){
for(int j=0;j<mapArray2[0].length;j++){
if(j==mapArray2[0].length-1){
System.out.print(mapArray2[i][j]);
}else{
System.out.print(mapArray2[i][j]+"\t");
}
}
System.out.println();
}
}
}
}
二、队列
1、使用数组模拟普通队列,此队列使用一次就不能够复用,浪费资源(同时此队列可以自己添加对应的方法)
import java.util.Scanner;
/**
* 数组模拟队列相关操作
*/
public class test1 {
public static void main(String[] args) {
//可容纳6个元素
arrayQueue queue=new arrayQueue(5);
Scanner scanner=new Scanner(System.in);
boolean flag=true;
while(flag){
System.out.println("show: 显示队列");
System.out.println("add: 添加数据");
System.out.println("get: 出队列");
System.out.println("peek: 显示队列头元素");
System.out.println("exit: 退出程序");
String str=scanner.next();
switch (str){
case "show":
queue.show();
break;
case "add":
System.out.println("输入一个数");
int val=scanner.nextInt();
queue.add(val);
break;
case "get":
System.out.println(queue.getFront());
break;
case "peek":
System.out.println(queue.peek());
break;
case "exit":
scanner.close();
flag=false;
break;
default:
break;
}
}
System.out.println("程序退出!");
}
}
//使用数组模拟队列
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;
arr=new int[maxSize];
}
//判断队列是否满的方法
public boolean isFull(){
if(rear==maxSize-1){
return true;
}else {
return false;
}
}
//判断队列是否为空
public boolean isEmpty(){
if(front==rear){
return true;
}else{
return false;
}
}
//添加数据
public void add(int n){
if(isFull()){
System.out.println("队列已满!");
return;
}
rear++;
arr[rear]=n;
}
//检索但不删除此队列的头,如果此队列为空,则返回 null
public int peek(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front+1];
}
//出队列
public int getFront(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
front++;
return arr[front];
}
//显示队列的全部数据
public void show(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
System.out.println(arr[i]);
}
System.out.println(arr[i]+" ");
}
}
}
2、环形队列。我们可以通过取模的方式生成环形队列,可以复用。队列满的条件:(rear+1)%maxSizefront;队列为空的条件:rearfront。我们在普通队列的代码上稍作修改。
import java.util.Scanner;
/**
* 稀疏数组相关操作
*/
public class test1 {
public static void main(String[] args) {
//可容纳6个元素
arrayQueue queue=new arrayQueue(5);
Scanner scanner=new Scanner(System.in);
boolean flag=true;
while(flag){
System.out.println("show: 显示队列");
System.out.println("add: 添加数据");
System.out.println("get: 出队列");
System.out.println("peek: 显示队列头元素");
System.out.println("exit: 退出程序");
String str=scanner.next();
switch (str){
case "show":
queue.show();
break;
case "add":
System.out.println("输入一个数");
int val=scanner.nextInt();
queue.add(val);
break;
case "get":
System.out.println(queue.getFront());
break;
case "peek":
System.out.println(queue.peek());
break;
case "exit":
scanner.close();
flag=false;
break;
default:
break;
}
}
System.out.println("程序退出!");
}
}
//使用数组模拟队列
class arrayQueue{
private int maxSize;//队列的最大容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//存放数据
//构造方法
public arrayQueue(int maxSize){
this.maxSize=maxSize;
this.front=0;
this.rear=0;
arr=new int[maxSize];
}
//判断队列是否满的方法
public boolean isFull(){
if((rear+1)%maxSize==front){
return true;
}else {
return false;
}
}
//判断队列是否为空
public boolean isEmpty(){
if(front==rear){
return true;
}else{
return false;
}
}
//添加数据
public void add(int n){
if(isFull()){
System.out.println("队列已满!");
return;
}
arr[rear]=n;
rear=(rear+1)%maxSize;
}
//检索但不删除此队列的头,如果此队列为空,则返回 null
public int peek(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front+1];
}
//出队列
public int getFront(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
int value=arr[front];
front=(front+1)%maxSize;
return value;
}
public int size(){
return (rear+maxSize-front)%maxSize;
}
//显示队列的全部数据
public void show(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
for(int i=front;i<front+size();i++){
if(i==front+size()){
System.out.println(arr[i%maxSize]);
}
System.out.println(arr[i%maxSize]+" ");
}
}
}