使用Java数组结构实现大小固定的队列和栈

一、固定大小数组实现栈

实现栈中的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];
	}
}

猜你喜欢

转载自blog.csdn.net/itcats_cn/article/details/81431917