写在前面
这是瓜子二手车面试的第一道题目,如果之前没有手写过的话可能很晕,没错我就是这么晕,后来再仔细想想这个代码真的感觉自己面试尤其是算法题还是紧张,紧张到大脑短路,大脑一团浆糊但是自己的所谓结论就张口就来,面试官不怕你说错但是不希望看到你不经过大脑认真考虑瞎说瞎猜,特此记录一下这个面试题
既然是实现栈的结构,那么我看需要实现一些基础的栈的方法,于是我们定义一个接口IStack,在这里定义那些栈中常用的方法
public interface IStack {
int push(int element);
int pop();
int peek();
boolean empty();
int size();
}
如果我们看过ArrayList源码的话还记得里面是用的数组做的,即数组存储元素,而且我们也知道数组的长度和ArrayList集合大小并不相等,一般的话都是数组长度大于集合长度,因为我们实际上存储数据用的是数组那么当然数组的长度大于元素的个数才可以存储呢。这就会遇到下面这个问题:
如果集合长度和数组长度一样大,那么再放入一个元素怎么办?
因为数组是不可以动态扩容的,所以我们只能通过拷贝数组的方式重新建立一个数组
接下来看看我们的实现类
public class IntStack implements IStack {
//默认容量是10个
private static final int CAPITILY = 10;
//扩容因子,默认是扩充之前的两倍
private static final int FACTOR = 2;
//集合元素的个数
private int mSize = 0;
//核心数组,注意数组的长度>=集合长度(mArray.length>=mSize)
private int[] mArray = new int[CAPITILY];
@Override
public int push(int element) {
if(mSize>=mArray.length){
//如果数据满了需要考虑扩容了,这里默认是扩容为之前的两倍
//非常不推荐用Arrays.copy方法,其本质也是用了下面这个方法
//System.arraycopy真的很重要,基本上数组扩容都是这个方法做的
int[] newArray = new int[mArray.length*FACTOR];
System.arraycopy(mArray,0,newArray,0,mArray.length);
mArray = newArray;
}
mArray[mSize++] = element;
return element;
}
@Override
public int pop() {
if(mSize>0){
int result = mArray[mSize-1];
mArray[mSize - 1] = 0;
mSize--;
return result;
}else {
throw new EmptyStackException();
}
}
@Override
public int peek() {
if(mSize>0){
return mArray[mSize - 1];
}else {
throw new EmptyStackException();
}
}
@Override
public boolean empty() {
return mSize==0;
}
@Override
public int size() {
return mSize;
}
}
最后想说,如果我们对知识知其一半等于不知道。