栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据结构 队列Queue Java实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构 队列Queue Java实现

队列是一种先进先出的数据结构,本篇文章使用数组来实现队列

public class ArrayQueue {
	private int maxSize; //表示数组的最大容量(即队列的最大容量)
	private int front; //队列的头
	private int rear; //队列的尾
	private T[] data; //用于存放数据
	
	public ArrayQueue(int capacity) {
		this.maxSize = capacity; //容量
		this.front = -1; //默认值为-1
		this.rear = -1; //默认值为-1
		data = (T[]) new Object[maxSize];
	}

	
	public boolean isFull() {
		return rear == maxSize - 1;
	}

	
	public boolean isEmpty() {
		return rear == front;
	}

	public void add(T element) {
		if(isFull()) {
			System.out.println("队列已满");
			return;
		}
		rear++; //添加元素,让rear(尾巴)后移1位,本来为-1,此时为0
		data[rear] = element; //data[0] = element,此时rear已经为0,不再是-1
	}

	public T get() {
		if(isEmpty()) {
			System.out.println("队列为空");
			return;
		}
		front++; //去除元素,让front(头)后移1位,本来为-1,此时为0
		return data[front]; //return data[0]
	}

	public void show() {
		if(isEmpty()) {
			System.out.println("队列为空");
			return;
		}
		for(T element : data) {
			System.out.printf(element);
		}
	}
}

上面虽然实现了队列,但是有缺陷,无法循环利用,下面是循环队列的实现

public class CircleArrayQueue {
	private int maxSize; //最大容量
	private int front; //队列头部,默认为0
	private int rear; //队列尾部,默认为0
	private T[] data; //用于存放数据

	public CircleArrayQueue(int capacity) {
		this.maxSize = capacity;
		data = (T[]) new Object[maxSize];
	}

	public boolean isFull() {
		return (rear  + 1) % maxSize == front;
	}

	public boolean isEmpty() {
		return rear == front;
	}

	// 添加数据到队列
	public void add(T element) {
		// 判断队列是否满
		if (isFull()) {
			System.out.println("队列满,不能加入数据~");
			return;
		}
		//直接将数据加入
		data[rear] = element;
		//将 rear 后移, 这里必须考虑取模
		rear = (rear + 1) % maxSize;
	}

	// 获取队列的数据, 出队列
	public int get() {
		// 判断队列是否空
		if (isEmpty()) {
			// 通过抛出异常
			throw new RuntimeException("队列空,不能取数据");
		}
		// 这里需要分析出 front是指向队列的第一个元素
		// 1. 先把 front 对应的值保留到一个临时变量
		// 2. 将 front 后移, 考虑取模
		// 3. 将临时保存的变量返回
		int value = data[front];
		front = (front + 1) % maxSize;
		return value;
	}

	// 显示队列的所有数据
	public void show() {
		// 遍历
		if (isEmpty()) {
			System.out.println("队列空的,没有数据~~");
			return;
		}
		// 思路:从front开始遍历,遍历多少个元素
		// 动脑筋
		for (int i = front; i < front + size() ; i++) {
			System.out.printf("arr[%d]=%dn", i % maxSize, arr[i % maxSize]);
		}
	}
	
	// 求出当前队列有效数据的个数
	public int size() {
		// rear = 2
		// front = 1
		// maxSize = 3 
		return (rear + maxSize - front) % maxSize;   
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/315320.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号