栈
首先来介绍堆和栈的区别:
栈:是对程序指令的顺序控制;线程和顺序有关的放栈
堆:是用来存储数据的,存储引用数据,以及属于引用数据的基本数据;线程和顺序无关的放堆里;
栈的特点
先入后出,先入栈的在下面,后入栈的依次放上面先执行然后出栈 ,执行线
程, 线程栈空了后,线程执行完毕;
下面我来封装一个栈:
//栈 先入后出 每次取出的都是最新放进去的数据,可以边插入边取出
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;
}
}
}