一、栈的实现
用一个封装好的类来实现,将变量设置为private类型,设置一个flag变量指向栈顶,向外提供栈的基本方法。
push()------------压栈
pop()-------------出栈
show()-----------栈内元素依次出栈
扩容机制
当栈满继续压栈时创建一个新的更大的数组,并将原数组中的元素复制到新数组中,将新数组的开始地址赋给原数组,原数组中的元素会自动回收。
public class Stack {
private int[] arry1=new int[16];
private int flag=0;
public void push(int x)
{
if(flag==arry1.length)//当栈满时压栈进行扩容
{
int[] arrnew=new int[arry1.length*2];
for(int i=0;i<flag;i++)
arrnew[i]=arry1[i];
arry1=arrnew;
}
arry1[flag++]=x;
}
public void pop()
{
if(flag==0) {
System.out.println("没有数据了!");
return;
}
System.out.println("取出一个元素:"+arry1[flag-1]);
flag--;
}
public void show()
{
for(int i=0;i<flag;i++) {
System.out.print(arry1[i]+" ");
}
}
}
二、循环队列的实现
原理同栈的实现一样,设置两个变量outflag、putflag分别指向队首和队尾,队尾进队,队首出队。
扩容机制
创建一个更大的数组并将原数组中的元素复制到新数组中。
与数组不同的是:开始复制的位置不是从0开始,而是从outflag到putflag之间的元素。
注意理解 arrnew[i % arrnew.length] = arr[i % arr.length];//将原数组代码复制到新数组中。
public class QueueDemo {
private int[] arr = new int[16];
private int putflag = 0;
private int outflag = 0;
public void put(int x) {
if( putflag-outflag == arr.length ) {
int[] arrnew = new int[arr.length * 2];
for(int i = outflag; i < putflag; i++) {
arrnew[i % arrnew.length] = arr[i % arr.length];
}
arr = arrnew;
}
arr[ putflag % arr.length ] = x;
putflag++;
}
public void out() {
if( putflag == outflag ) {
System.out.println("队列已经空了");
return;
}
System.out.println("出队列的数据是:" + arr[ outflag % arr.length ]);
outflag++;
}
}