一、固定大小数组实现栈
实现栈中的push(压栈)、pop(弹栈)、peek(返回栈顶第一个元素)。若压栈时将超过数组的最大容量,抛出异常信息,若弹栈时index = -1,同样抛出异常信息。
核心思想:使用index作为指针,当进行压栈时候,判断index和arrSize的关系,且执行完压栈操作,index++,index指到元素下一个索引位置。当进行弹栈时候,同样判断index和arrSize的关系,此时index在元素的下一索引,因为push完后执行了index++操作,所以弹栈即执行arr[--index]即可。而peek()操作则不需要改变index指针,直接返回arr[index - 1]即可。
具体代码实现:
package cn.itcats.array;
/**
* 使用固定数组容量实现一个栈结构
*
* @author fatah
*
*/
public class ArrayStack {
private Integer[] arr;
private Integer index;
/**
* @params: initSize 栈的初始大小
* @throws IllegalArgumentException 栈的初始值不正确
*/
public ArrayStack(int initSize) {
if(initSize < 0){
throw new IllegalArgumentException("栈的初始值不正确: "+initSize);
}
arr = new Integer[initSize];
index = 0;
}
/**
* 压栈
* @param 传入压入栈的int值
* @throws ArrayIndexOutOfBoundsException 栈已满,无法再传入新的值"
*/
public int push(int value) {
if(index == arr.length) {
throw new ArrayIndexOutOfBoundsException("栈已满,无法再传入新的值, index不能为"+ (index+1));
}
return arr[index ++] = value;
}
/**
* 弹栈
* @throws ArrayIndexOutOfBoundsException 弹栈异常,index不能为 -1
*/
public Integer pop() {
if(index == 0) {
throw new ArrayIndexOutOfBoundsException("弹栈异常,index不能为 -1");
}
return arr[--index];
}
/**
* 返回栈顶第一个元素
* @throws
*/
public Integer peek() {
if(index == 0) {
return null;
}
return arr[index - 1];
}
}
二、固定大小的数组实现队列
实现原理:使用end和start变量分别记录队列的入队和出队情况
具体代码实现:
package cn.itcats.array;
/**
* 使用固定数组长度实现一个有界队列
* @author fatah
*
*/
public class ArrayQueue {
private Integer start;
private Integer end;
private Integer[] arr;
private Integer size;
/**
* @param initSize 初始化有界队列大小
* @throws
*/
public ArrayQueue(int initSize) {
if(initSize < 0) {
throw new IllegalArgumentException("初始化队列失败,initSize: "+initSize);
}
this.end = 0;
this.start = 0;
this.size = 0;
arr = new Integer[initSize];
}
/**
* 入队
* @param value 传入加入队列的值
* @throws ArrayIndexOutOfBoundsException 队列已满
*/
public void push(int value) {
if(arr.length == size) {
throw new ArrayIndexOutOfBoundsException("队列已满");
}
size ++;
arr[end] = value;
end = end < arr.length - 1 ? end +1 : 0;
}
/**
* 出队
* @throws ArrayIndexOutOfBoundsException 队列已空
*/
public Integer pop() {
if(size == 0) {
throw new ArrayIndexOutOfBoundsException("队列已空");
}
size --;
int temp = start;
start = start < arr.length -1 ? start + 1 : 0;
return arr[temp];
}
/**
* 返回队列的第一个元素
*/
public Integer peek() {
if(size == 0) {
return null;
}
return arr[start];
}
}