自己动手写一个简单的队列结构

自己动手写一个简单的队列结构

队列(Queue)是除了数组和栈之外另一个比较简单的数据结构,它的特点跟栈有点区别,它的特点是“先进先出”,如果说栈是一个桶,那么队列就是一个管道,只能从一头添加元素,一头删除元素。

队列
在这个例子中,我们的队列的底层是一个数组,通过两个指针来达到队列的效果,具体的原理如图。
初始化数组和指针

初始化队列

队列插入1通过两个指针来定义队列中的元素

插入元素2当指针大于数组长度的时候,则重置为初始化值,从头指针到尾指针之间即是整个队列中的元素。

实现代码如下:

package myQueue;

public class MyQueue {
	// 队列的底层结构是一个数组,所以在这里我们定义一个数组
	private long[] arr;
	// 定义一个表示队列中元素数目的变量
	private int elements;
	// 定义队列头索引
	private int front;
	// 定义队列尾索引
	private int rear;

	/**
	 * 空参构造
	 */
	public MyQueue() {
		// 默认队列长度为30
		arr = new long[30];
		// 元素为0
		elements = 0;
		// 队头为0
		front = 0;
		// 队尾为-1,表示没有数据
		rear = -1;
	}

	/**
	 * 有参构造
	 * @param MaxSize
	 */
	public MyQueue(int MaxSize) {
		// 使用用户传入的参数作为队列长度
		arr = new long[MaxSize];
		// 队列初始元素,队头,队尾同空参构造
		elements = 0;
		front = 0;
		rear = -1;
	}

	/**
	 * 插入元素,只能从队尾插入
	 * @param value
	 */
	public void insert(long value) {
		// 先判断队尾是否满了
		if (!this.isFull()) {
			// 这一步是为了循环使用数组的索引,当队尾索引等于数组最大索引时
			// 将其重置为-1, 队头和队尾之间的是整个队列
			// 这样避免了ArrayIndexOutOfBoundsException
			if (rear == arr.length - 1) {
				rear = -1;
			}
			// 插入元素
			arr[++rear] = value;
			// 元素数目加1
			elements++;
		}
	}

	/**
	 * 从队头删除一个元素并返回
	 * @return
	 */
	public long remove() {
		// 获取一个瓶子来装即将要删除的元素
		long tmp = 0;
		// 如果有元素,即队列不是空的
		if (elements != 0) {
			// 获取要删除的数,并把队头索引+1,+1就是删除了
			tmp = arr[front++];
			// 如果删除到队尾了,则重置front
			if (front == arr.length) {
				front = 0;
			}
			// 删除一个元素,计数-1
			elements--;
		}
		// 返回这个被删除的数
		return tmp;
	}

	/**
	 * 查询队头的元素
	 * @return
	 */
	public long peek() {
		return arr[front];
	}

	/**
	 * 判断队列是否空
	 * @return
	 */
	public boolean isEmpty() {
		return elements == 0;
	}

	/**
	 * 判断队列是否满了
	 * @return
	 */
	public boolean isFull() {
		return elements == arr.length;
	}

}

测试代码:

package myQueue;

public class TestMyQueue {
	public static void main(String[] args) {
		MyQueue myQueue = new MyQueue(5);
		myQueue.insert(1);
		myQueue.insert(2);
		myQueue.insert(3);
		myQueue.insert(4);
		myQueue.insert(5);
		myQueue.insert(6);

		System.out.println("队列是否满了:"+myQueue.isFull());
		System.out.println("删除所有数据:");
		for(int i = 1; i <= 5; i++) {
			System.out.print(myQueue.remove() + "  ");
		}
		System.out.println();
		System.out.println("队列是否为空:"+myQueue.isEmpty());
		myQueue.insert(125);
		myQueue.insert(102);
		System.out.println(myQueue.remove());
		System.out.println(myQueue.remove());
	}
}

控制台输出
队列是否满了:true
删除所有数据:
1 2 3 4 5
队列是否为空:true
125
102

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉拌糖醋鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值