浅解堆和栈

首先来介绍堆和栈的区别:
:是对程序指令的顺序控制;线程和顺序有关的放栈

:是用来存储数据的,存储引用数据,以及属于引用数据的基本数据;线程和顺序无关的放堆里;

栈的特点
先入后出,先入栈的在下面,后入栈的依次放上面先执行然后出栈 ,执行线
程, 线程栈空了后,线程执行完毕;

 下面我来封装一个栈:
//栈   先入后出  每次取出的都是最新放进去的数据,可以边插入边取出
public class StackDemo1 {

    private int[] arr = new int[20];//一开始定义一个数组,长度20;用来当栈
    private int top = 0;//一个是记录下一次放的位置,一个是记录当前站内数量

    public void add(int a) {//数据进栈的方法
        arr[ top ] = a;
        top++;
        if( top == arr.length ) {//当数据把栈装满了时;我们可以把数组的长度扩展一倍;
            int[] arrnew = new int[ arr.length * 2 ];
            for( int i = 0; i < arr.length; i++ ) {
                arrnew[i] = arr[i];
            }
            arr = arrnew;
        }
    }

    public void del() { //数据出栈的方法
        if( top < 1 ) { //数组里没有数据的时候
            System.out.println( "没有数据了" );
            return;
        }
        System.out.println( arr[ top - 1 ] );//输出的栈里面的顶部数据
        top--;

        if( top < arr.length/2 ) {//当栈里面的数据少于一半的时候;
            int newlen = arr.length/2;//我们把数组的长度可以缩小一部分
            if( newlen < 20) {
                newlen = 20;
            }
            int[] arrnew = new int[ newlen ];
            for( int i = 0; i < arrnew.length; i++ ) {
                arrnew[i] = arr[i];
            }
            arr = arrnew;
        }
    }

}

以上是对栈的封装,和栈里面的数据改如何放进去,如何取出来的封装,当我们要用时可以直接调用,这个也是栈的原理

队列(queue)

队列的特点
和栈相反:先入先出
队列的删除:其实就是把以前的给覆盖了;

public class QueDemo {

    private int[] arr = new int[20];
    private int top = 0;//一个是记录下一次放的位置,一个是记录当前站内数量

    public void add(int a) {//跟栈的存数据一样
        arr[ top ] = a;
        top++;
        if( top == arr.length ) {
            int[] arrnew = new int[ arr.length * 2 ];
            for( int i = 0; i < arr.length; i++ ) {
                arrnew[i] = arr[i];
            }
            arr = arrnew;
        }
    }
    public void del() {//取数据的时候取数组里的第一个数据,就可以实现队列的输出

        if( top < 1 ) {
            System.out.println( "没有数据了" );
            return;
        }

        System.out.println( arr[ 0 ] );
        top--;

        for(int i = 0; i < top; i++ ) {
            arr[i] = arr[ i + 1 ];//队列  初步运算
        }//把后面的数据放到前面去,因为取出去了第一个数据;

        if( top < arr.length/2 ) {//如果队列的数据剩下一半;那么为了提升效率,把队列收缩;
            int newlen = arr.length/2;
            if( newlen < 20 ) {
                newlen = 20;
            }
            int[] arrnew = new int[ newlen ];
            for( int i = 0; i < arrnew.length; i++ ) {
                arrnew[i] = arr[i];
            }
            arr = arrnew;
        }
    }
}

以上是基本的队列;

关于循环队列

循环队列就是可以一边插入一边输出的队列,大大的提升了队列的效率
输出的数据在队列的头部,就是先进来的数据;而插入的数据会插入到队列的尾部;用这样的方法来达到先入先出的效果;

public class peix1 {
    private int[] arr = new int[20];
    private int top = 0;//一个是记录下一次放的位置,一个是记录当前站内数量
    private int bottom=0;//记录最开头数据的下标

    public void add(int a) {//插入数据的方法
        arr[ top%arr.length] = a;
        top++;
        if( top -bottom == arr.length ) {//当队列满了扩容
            int[] arrnew = new int[ arr.length * 2 ];
            for( int i = 0; i < arr.length; i++ ) {
                arrnew[i] = arr[(bottom +i)% arr.length];
            }
            arr = arrnew;//给新的队列定以下标
            top=top-bottom;
            bottom=0;
        }
    }
    public void del() {    //取出数据
        if(bottom == top ) {//当队列为空时
             System.out.println("无数据");
             return;
        }

        System.out.println( arr[bottom%arr.length] );
        bottom++;//取出队列里面的最开头的数据

        if(top-bottom==arr.length/2&&top-bottom+1>20)
        {//当队列里面的数据少于一半时候,我们为了提升效率,跟栈一样,收缩队列长度
            int[] arrnew=new int[arr.length/2];
            for(int i=0;i<arrnew.length;i++) {
                arrnew[i]=arr[(bottom+i)%arr.length];
            }
            arr=arrnew;
            bottom=0;
            top=arr.length;
        }
    }

}

本人小白,有任何问题还望大佬多多指点
日常学习总结算法

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
vegetable_more_exercise:1-1.5万,没错啊,最少是1人民币,在区间内
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务