一 数组模拟栈
栈(stack),它是一种运算受限的线性表。这种限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底,向一个栈中插入新元素,我们一般称为入栈或者压栈,从一个栈中删除元素,我们一般称为弹栈或者出栈,即先进后出
入栈过程
首先声明一个固定大小的数组arr,并将索引index指向0位置,压入数据的时候,先给arr[index]赋值,再将index++
注意点:
如果index=arr.length的时候,用户要入栈,给用户抛出“栈已满”的异常(下图最右边的情况)
弹栈过程
用户调用弹栈的功能的时候,先将index--,然后再将arr[index]返回即可
注意点:
如果index=0的时候,用户要弹栈,给用户抛出“栈为空”的异常(下图最右边的情况)
如果用户只是要查看栈顶的数据,不是弹栈的话,只需要将arr[index-1]返回就行,但是不要添加index--功能(查看的时候,也需要先判断有没有数据,即index是否为0)
代码
理解了上面的流程后,代码就比较容易理解了(友情提示:手机观看的话,下面代码可左右滑动)
public class ArrayStack {
//准备一个数组和一个指针
private Integer[] arr;
private Integer index;
//构造函数
public ArrayStack(int stackSize) {
if (stackSize < 0) {
throw new IllegalArgumentException("初始化大小不能小于0");
}
//初始化一个数组,并将指针指向索引0位置
arr = new Integer[stackSize];
index = 0;
}
//向栈中存入数据
public void push(int num){
if(index==arr.length){
throw new IllegalArgumentException("栈已满");
}
arr[index]=num;
index++;
}
//从栈中弹出数据
public Integer pop(){
if(index==0){
throw new IllegalArgumentException("栈目前为空");
}
index--;
return arr[index];
}
//查看目前栈顶数据
public Integer peek(){
if(index==0){
return null;
}
return arr[index-1];
}
}
二 数组模拟队列
队列是只允许在表的前面进行删除操作,表的后面进行插入数据,也就是所谓的先进先出
图解过程
首先准备一个数组,以及一个first索引,last索引
插入新数据的时候,在last位置插入数据,并且将last++(first不动)
删除数据的时候,将arr[first]返回,并且将first++
注意:
1、last来到数组末尾arr.length-1的时候,插入数据后,要将last=0,即回到数组索引0位置
2、first也是一样,到达arr.lenght-1时,删除数据后,也要将first=0
从上面的流程可以感觉的出,first一直追着last,记住这种感觉哈
代码
public class ArrayQueue {
private Integer[] arr;
//这里size是用来判断队列目前的数据容量状况,为0,说明队列为空,为arr.length,说明队列满
private Integer size;
//用来指向当前队列的第一个数
private Integer first;
//用来指向当前队列的最后一个数
private Integer last;
//初始化队列
public ArrayQueue(int queueSize) {
if (queueSize < 0) {
throw new IllegalArgumentException("初始化大小不能小于0");
}
arr = new Integer[queueSize];
size = 0;
first = 0;
last = 0;
}
//插入新数据
public void push(int num) {
if (size == arr.length) {
throw new IllegalArgumentException("队列已满");
}
//如果执行到这里,说明队列未满
arr[last] = num;
size++;
//如果队列最后一个数到达数组末尾,
// 用户还往队列里添加数据的话,则将索引指向数组0位置
if (last == arr.length - 1) {
last = 0;
} else {
last++;
}
}
//弹出队列数据
public Integer poll() {
if (size == 0) {
throw new IllegalArgumentException("队列为空");
}
//如果队列执行到这里,说明队列中还有数据
int temp = first;
size--;
//如果队列第一个数到达数组末尾,
// 用户还从队列中拿数据的话,则将索引指向数组0位置
if (first == arr.length - 1) {
first = 0;
} else {
first++;
}
return arr[temp];
}
public Integer peek() {
if (size == 0) {
return null;
}
return arr[first];
}
}