算法之路_17、用数组结构实现大小固定的队列和栈
程序员文章站
2022-07-14 14:19:32
...
题目:用数组结构实现大小固定的队列和栈
一、数组实现栈结构:
栈结构是先进后出的,只需要一个数组和一个记录位置的变量size,当进来一个元素,size就++,出去一个元素size就--
public class ArrayStack{
private Integer[] arr;
private Integer size;
/**
* 栈初始化
* @param initSize 初始化数组容量
*/
public ArrayStack(int initSize){
if (initSize<0)
throw new IllegalArgumentException("参数不合理!");
arr=new Integer[initSize];
size=0;
}
/**
* @Description: 返回栈顶元素
* @return: 栈空 返回null 栈不空 返回栈顶元素
* @date: 2019/4/23 10:12
*/
public Integer peek(){
if (size==0)
return null;
Integer num = arr[size - 1];
return num;
}
/**
* @Description: 压栈操作
* @param: 待压入元素
* @date: 2019/4/23 10:15
* @throws: 栈满时,抛出数组越界异常
*/
public void push(int obj){
if (size==arr.length)
throw new ArrayIndexOutOfBoundsException("栈满,无法压入!");
arr[size++]=obj;
}
/**
* @Description: 弹栈操作
* @return: 返回栈顶元素 并数量减一
* @date: 2019/4/23 10:19
* @throws : 栈空时抛出数组越界异常
*/
public Integer pop(){
if (size==0)
throw new ArrayIndexOutOfBoundsException("栈空,无法弹栈!");
return arr[--size];
}
}
二、.实现队列结构:相对栈结构麻烦一些,队列要求先进先出,本案例中设置一个数组和三个变量,size用于记录元素总数,last记录刚进来的元素应该放在哪个位置即队尾,first表示用户要求弹出的元素所在的位置即队首。或许有些同学会觉得size是多余的,完全可以不要。但是size的作用并不仅仅是记录总数,它还有一个作用是使得last与first解耦,避免在一些代码中的一些麻烦。
public class Code_01_Array_To_Stack_Queue {
public static class ArrayStack{
private Integer[] arr;
private Integer size;
/**
* 栈初始化
* @param initSize 初始化数组容量
*/
public ArrayStack(int initSize){
if (initSize<0)
throw new IllegalArgumentException("参数不合理!");
arr=new Integer[initSize];
size=0;
}
/**
* @Description: 返回栈顶元素
* @return: 栈空 返回null 栈不空 返回栈顶元素
* @date: 2019/4/23 10:12
*/
public Integer peek(){
if (size==0)
return null;
Integer num = arr[size - 1];
return num;
}
/**
* @Description: 压栈操作
* @param: 待压入元素
* @date: 2019/4/23 10:15
* @throws: 栈满时,抛出数组越界异常
*/
public void push(int obj){
if (size==arr.length)
throw new ArrayIndexOutOfBoundsException("栈满,无法压入!");
arr[size++]=obj;
}
/**
* @Description: 弹栈操作
* @return: 返回栈顶元素 并数量减一
* @date: 2019/4/23 10:19
* @throws : 栈空时抛出数组越界异常
*/
public Integer pop(){
if (size==0)
throw new ArrayIndexOutOfBoundsException("栈空,无法弹栈!");
return arr[--size];
}
}
public static class ArrayQueue{
private Integer[] arr;
private Integer size;
private Integer first;
private Integer last;
public ArrayQueue(int arrSize){
if (arrSize==0)
throw new IllegalArgumentException("参数非法!");
arr = new Integer[arrSize];
size=0;
first=last=0;
}
/**
* @Description: 返回队首元素
*/
public Integer peek(){
if (size==0)
return null;
return arr[first];
}
public void push(int obj){
if (size==arr.length)
throw new ArrayIndexOutOfBoundsException("队满!");
size++;
arr[last]=obj;
last= last==arr.length-1 ? 0 : last+1;
}
public Integer poll(){
if (size==0)
throw new ArrayIndexOutOfBoundsException("队空!");
size--;
int temp=first;
first = first == arr.length-1 ? 0 : first+1;
return arr[temp];
}
}