数据结构与算法总结一

数据结构与算法总结

一、稀疏数组

/**
 * 稀疏数组相关操作
 */
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]+" ");
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值