我们都知道栈和队列这两种最基本的数据结构,他们的特点分别为---栈:先进后出 队列:先进先出。那么,在java中如何利用数组来实现这两种数据结构的呢?
一、实现栈:就是用一个数组来实现栈这个数据结构
/**
* 因为所有的数据结构必然是要落地的,所以在Java中如何去吧栈和队列这两个数据结构表现出来呢
* 我们用的是数组来实现的
* @author zhmm
*
*/
//用数组来实现栈这个数据结构
public static class ArrayStack {
//只需要两个变量数组和index
//index也就是栈的指针
private Integer[] arr;
private Integer index;
//栈初始化方法 、
//其实就是初始化一个数组用它来实现栈,这个栈里包括栈的属性,也就是长度和index
public ArrayStack(int initSize) {
if (initSize < 0) {
throw new IllegalArgumentException("The init size is less than 0");
}
arr = new Integer[initSize];
index = 0;
}
//这个方法只拿栈顶的数据但不删除栈顶元素
public Integer peek() {
if (index == 0) {
return null;
}
return arr[index - 1];
}
//这个方法是用来给栈添加元素,同时栈顶指针加1
public void push(int obj) {
if (index == arr.length) {
throw new ArrayIndexOutOfBoundsException("The queue is full");
}
arr[index++] = obj;
}
//这个方法是用来删除栈顶元素 同时栈顶指针-1
public Integer pop() {
if (index == 0) {
throw new ArrayIndexOutOfBoundsException("The queue is empty");
}
return arr[--index];
}
}
二、利用数组实现队列这个数据结构
实现队列:队列的特点是先进先出,要想用数组实现栈这个数据结构,我们首先需要一个end变量,它是来标识当前队列新进一个数,当前数要填充的位置,start表示当前队列要出去一个数,要出去那个数的位置,用一个size来联系end与start之间的关系。size其实就是当前队列的当前有数的长度①加数的逻辑:当队列进一个数据的时候,end的值+1,当end的值等于size的候也就是超过队列长度的时候,end回到原点,也就是初始位置(加一次size+1)②拿数的逻辑:start变量从队列的开始开始,当拿一个数据的时候start的值+1,当start的值等于size的时候,也是从头开始,但start的值不大于end的值,其实就是借助size帮end与start建立一个联系(但start和end之间并没有关系)当size不为数组长度的时候end总可以循环,当size的值不为0时,start总可以拿值(拿一次size-1)
public static class ArrayQueue {
//arr这个数组用来标识这个队列的最大长度
private Integer[] arr;
//size标识当前队列的长度
//用来给first和last解耦用的
private Integer size;
//first表示的也就是start,也就是队列拿值的时候的位置
private Integer first;
//last表示的就是end,其实也就是队列加数的时候的位置
private Integer last;
//初始化队列
public ArrayQueue(int initSize) {
if (initSize < 0) {
throw new IllegalArgumentException("The init size is less than 0");
}
arr = new Integer[initSize];
size = 0;
first = 0;
last = 0;
}
//只取队列的值但并不删除元素
public Integer peek() {
if (size == 0) {
return null;
}
return arr[first];
}
//向队列中添加元素 当前队列长度size+1
public void push(int obj) {
//当当前队列的长度等于最大长度的时候,抛出异常,队列已满
if (size == arr.length) {
throw new ArrayIndexOutOfBoundsException("The queue is full");
}
size++;
arr[last] = obj;
//要是当前last到达底部,循环回到数组顶部(last始终是队列的队尾)
last = last == arr.length - 1 ? 0 : last + 1;
}
//从队列中取出元素,当前size-1
public Integer poll() {
if (size == 0) {
throw new ArrayIndexOutOfBoundsException("The queue is empty");
}
size--;
//要返回的数,因为要在返回的时候,start也要+1所以存储到一个临时变量
int tmp = first;
first = first == arr.length - 1 ? 0 : first + 1;
return arr[tmp];
}
}