Java实现循环队列

package fun.xinghai.circlearray;

import java.util.Scanner;

public class CircleArray {

	public static void main(String[] args) {
		// 创建一个循环队列
		CircleArrayQueue queue = new CircleArrayQueue(4); //容量为4, 其队列的有效数据个数最大是3
		char key = ' '; // 接收用户输入
		Scanner scanner = new Scanner(System.in);
		boolean loop = true;
		// 输出一个菜单
		while (loop) {
			System.out.println("s(show): 显示队列");
			System.out.println("e(exit): 退出程序");
			System.out.println("a(add): 添加数据到队列");
			System.out.println("g(get): 从队列取出数据");
			System.out.println("h(head): 查看队列头的数据");
			key = scanner.next().charAt(0);// 接收一个字符
			switch (key) {
				case 's': //打印队列
					queue.showQueue();
					break;
				case 'a': //输入数据
					System.out.println("输入一个数:");
					int value = scanner.nextInt();
					queue.addElem(value);
					break;
				case 'g': // 取出数据
					try {
						int res = queue.getElem();
						System.out.printf("取出的数据是%d\n", res);
					} catch (Exception e) {
						// TODO: 打印异常信息
						System.out.println(e.getMessage());
					}
					break;
				case 'h': // 查看队列头的数据
					try {
						int res = queue.headElem();
						System.out.printf("队列头的数据是%d\n", res);
					} catch (Exception e) {
						// TODO: 打印异常信息
						System.out.println(e.getMessage());
					}
					break;
				case 'e': // 退出
					scanner.close();
					loop = false;
					break;
				default:
					break;
			}
		}
		System.out.println("程序退出~~");
	}

}

class CircleArrayQueue {
	private int maxSize; // 队列最大容量为maxSize,其有效数据为maxSize - 1,预留一个空间做约定
	private int front; // 指向队列的第一个元素,初始值为0
	private int rear; // 指向队列最后一个元素的下一个位置,初始值为0
	private int[] arr; // 用数组模拟队列

	public CircleArrayQueue(int arrMaxSize) {
		maxSize = arrMaxSize;
		arr = new int[maxSize];
	}

	// 判断队列是否为空
	public boolean isEmpty() {
		return front == rear;
	}

	// 判断队列是否为满
	public boolean isFull() {
		return (rear + 1) % maxSize == front;
	}

	// 向队列中添加元素
	public void addElem(int elem) {
		// 先判断空间是否足够
		if (isFull()) {
			System.out.println("队列已满,无法添加元素!");
			return;
		}
		arr[rear] = elem;
		rear = (rear + 1) % maxSize; // 队尾指针后移
	}

	// 从队列中取出元素
	public int getElem() {
		// 先判断是否存在元素
		if (isEmpty()) {
			throw new RuntimeException("队列为空,无法取出元素!"); // 抛出异常
		}
		int elem = arr[front];
		front = (front + 1) % maxSize; // 队首指针后移
		return elem;
	}

	// 显示队列的头数据, 注意不是取出数据
	public int headElem() {
		// 先判断队列是否为空
		if (isEmpty()) {
			throw new RuntimeException("队列为空,没有数据!");
		}
		return arr[front];
	}

	// 获取队列有效数据个数
	public int getSize() {
		return (rear + maxSize - front) % maxSize; // 从rear和front在循环队列中的位置关系去思考有效数据个数
	}

	// 打印队列
	public void showQueue() {
		// 先判断队列是否为空
		if (isEmpty()) {
			System.out.println("队列为空,没有数据!");
		}
		for (int i = front; i < front + getSize(); i++) {
			System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值