Java数据结构@环形队列

需求:用数组实现环形队列

代码实现:

/**
 * @ClassName: CircleQueue
 * @Description: 
 * @Author: xuezhouyi
 * @Version: V1.0
 **/
public class CircleQueue {
	private static class Test {
		public static void main(String[] args) {
			CircleQueue cq = new CircleQueue(4);
			cq.offer(1);
			cq.show();
			cq.offer(3);
			cq.show();
			cq.offer(5);
			cq.show();
			cq.offer(7);
			cq.show();
			cq.poll();
			cq.show();
			cq.offer(7);
			cq.show();
			cq.offer(9);
			cq.show();
			cq.poll();
			cq.show();
			cq.poll();
			cq.show();
			cq.poll();
			cq.show();
			cq.poll();
			cq.offer(9);
			cq.show();
			cq.poll();
			cq.show();
			cq.offer(9);
			cq.show();
			cq.offer(8);
			cq.show();
			/* 输出:
				成功加入元素:1
				0<=>1
				成功加入元素:3
				0<=>1
				1<=>3
				成功加入元素:5
				0<=>1
				1<=>3
				2<=>5
				队列已满,无法加入!
				0<=>1
				1<=>3
				2<=>5
				取出一个元素:1
				1<=>3
				2<=>5
				成功加入元素:7
				1<=>3
				2<=>5
				3<=>7
				队列已满,无法加入!
				1<=>3
				2<=>5
				3<=>7
				取出一个元素:3
				2<=>5
				3<=>7
				取出一个元素:5
				3<=>7
				取出一个元素:7
				<空>
				没有元素
				成功加入元素:9
				0<=>9
				取出一个元素:9
				<空>
				成功加入元素:9
				1<=>9
				成功加入元素:8
				1<=>9
				2<=>8
			* */
		}
	}

	private int[] circleArr;
	private int front;
	private int end;

	public CircleQueue(int size) {
		circleArr = new int[size];
	}

	/* 分析如何计算索引加一:
		因为是循环数组,所以当索引指向最后一个位置时需要考虑如何回到初始索引位置
		可以通过简单的取余算法来实现
	* */
	private int next(int index) {
		return (index + 1) % circleArr.length;
	}

	/* 分析如何计算元素个数:
		如果end大于front则end减front
		如果end小于front则end加长度-front
		if (end < front)
			return end + circleArr.length - front;
		return end - front;
		或者如下
	* */
	private int size() {
		return (end + circleArr.length - front) % circleArr.length;
	}

	/* 分析如何遍历数组:
		front索引一直加一直到和end索引重合则遍历结束,这就需要使用next()函数
	* */
	public void show() {
		if (size() == 0)
			System.out.println("<空>");
		/* 从front位置开始遍历到front加count结束 */
		for (int i = front; i < front + size(); i++) {
			/* 取出元素需要注意对长度取余 */
			System.out.println(i + "<=>" + circleArr[i % circleArr.length]);
		}
	}

	/* 添加元素到队列 */
	public void offer(int e) {
		if (isFull()) {
			System.out.println("队列已满,无法加入!");
		} else {
			circleArr[end] = e;
			end = next(end);
			System.out.println("成功加入元素:" + e);
		}
	}

	/* 分析数组是否还可以存:
		如果end和front一样的话就存在一个问题,当end一直存存存到满之后再加一会和front的值一样,
		这样就没法确定这个数组是空的还是满的,所以是需要将end后移一位,也就是始终保证数组留有一个空位
	* */
	private boolean isFull() {
		return front == next(end);
	}

	/* 取出元素 */
	public void poll() {
		if (isEmpty()) {
			System.out.println("没有元素");
		} else {
			System.out.println("取出一个元素:" + circleArr[front]);
			front = next(front);
		}
	}

	/* 检查数组是否还可以取 */
	private boolean isEmpty() {
		return front == end;
	}
}
发布了54 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/DataIntel_XiAn/article/details/99692297