浅解堆和栈
栈
首先来介绍堆和栈的区别:
栈:是对程序指令的顺序控制;线程和顺序有关的放栈
堆:是用来存储数据的,存储引用数据,以及属于引用数据的基本数据;线程和顺序无关的放堆里;
栈的特点
先入后出,先入栈的在下面,后入栈的依次放上面先执行然后出栈 ,执行线
程, 线程栈空了后,线程执行完毕;
下面我来封装一个栈:
//栈 先入后出 每次取出的都是最新放进去的数据,可以边插入边取出 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; } } }
本人小白,有任何问题还望大佬多多指点
日常学习总结算法