栈的代码实现
一:概念
1:定义
栈是一种只允许在一段进行插入和删除操作的线性表。
栈是一种先进后出的线性表
2:栈顶
线性表允许插入和删除的一端
3:栈底
固定的,不允许进行插入和删除。
按下图所示,入栈顺序为a,b,c,d;出栈顺序为d,c,b,a
二:栈的实现图例
三:代码实现
1:前期准备
定义元素个数 private int num; 定义存元素的数组 private Object[] value; 设置一个默认容量 private static final int DEFAULT_CAPACITY = 10; 设置一个无参构造,调用方法,该方法定义了默认容量的应用和不符合默认容量时该怎么做。 上面的方法调用下面的方法 public MyStack(){ this(DEFAULT_CAPACITY); } public MyStack(int capacity){ if(capacity < 0){ //如果后面new的元素个数小于0时,就设置为默认容量。 capacity = DEFAULT_CAPACITY; } value = new Object[value]; }
2:入栈
/** * 将元素压入栈顶 * 入栈 * @param element 要压入的元素 * 还需要考虑是否需要扩容。 */ void push(Object element){ if(num + 1 > value.length){ grow(); //扩容 } value[num] = element; num ++; }
3:扩容方法
private void grow(){ int oldCapacity = value.length; int newCapacity = oldCapacity << 1; //翻倍扩容 if(newCapacity < oldCapacity){ newCapacity = Integer.MAX.VALUE; //自己犯错点:这一步是给新的数组长度赋值为int的最大长度 } value = Arrays.copyOf(value,newCapacity); //Array.copyOf里面添加的是数组名以及长度,System.arrayCope()在应用时需要定义一个新的数组,然后里面添加的依次是(旧数组名称,起始位置,新数组名称,起始位置,复制长度) }
4:出栈
/** * 弹出栈顶元素并返回 * 把栈顶元素删除,并返回 * 出栈 * @return 弹出的栈顶元素, 如果栈为空返回 null */ Object pop(){ Object element = value[num - 1]; //栈顶元素 value[num - 1] = null; length --; return element; }
5:返回栈顶元素
/** * 返回栈顶元素,但不弹出 * @return 栈顶元素 */ Object peek(){ return value.length - 1; }
6:检查栈是否为空
/** * 检查栈是否为空 * @return 如果栈为空则返回true,否则返回false */ boolean isEmpty(){ return num == 0; }
7:返回栈中元素个数
int size(){ return num; }
8:最后以数组的形式进行输出
public String toSrtring(){ StringBuilder sb = new StringBuilder(); sb.append("["); for(i = 0; i < num-1;i ++){ sb.append(value[i] + ","); } sb.append(value[num - 1]).append("]"); return.toString(); }
队列的代码实现
一:基本概念
1:队列定义
队列是只允许在一端进行插入操作,而在另外一端进行删除操作的线性表。
队列是一种先进先出的线性表。
2:对头
允许删除的一端。
3:队尾
允许插入的一端。
按下图所示,入队顺序为1,2,3,4
出对顺序为1,2,3,4
二:对列的实现图例
三:代码实现
1:前期准备
定义元素个数 private int size; 定义元素数组 private Object[] value; 定义一个默认容量 private static final int DEFAULT_CAPACITY = 10; public MyEqeue(){ this(DEFAULT_CAPACITY); } public MyEqeue(int capacity){ if(capacity < 0){ capacity = DEFAULT_CAPACITY; } value = new Object[capaciyt]; }
2:入队
/** * 将元素插入队尾 * @param element 要插入的元素 */ abstract void push(Object element){ if(size + 1 > value.length){ grow(); } value[size] = element; size ++; }
3:扩容
private void grow(){ int old = value.length; //原长度为数组长度 int newCapacity = old + 10; //定长扩容 if(newCapacity < old){ nweCapacity = Intager.MAX_VALUE; } value = Arrays.CopyOf(value,newCapacity); //注意长度为新的长度 }
4:出队
/** * 移除并返回队首元素 * 删除第一个元素,并返回 * @return 队首元素, 如果队列为空时,返回 null */ abstract Object pop(){ Object element = value[0]; value[0] = null; System.arraycopy(value,1,value,0,size - 1); // 将删除队首元素后的队列往前移一位。 value[size - 1] = null; //把往前移动完的队列最后一个元素置空 size --; return element; }
5:返回队首元素
/** * 返回队首元素,但不移除 * @return 队首元素 */ abstract Object peek(){ return value[0]; }
6:检查队列是否为空
/** * 检查队列是否为空 * @return 如果队列为空则返回true,否则返回false */ abstract boolean isEmpty(){ return size == 0; }
和7:返回队列中元素个数
/** * 返回队列中的元素个数 * @return 队列中元素的个数 */ abstract int size(){ return size; }