java 数组实现循环链表

实现循环链表的难点在于, 当front和rear指向同一个位置时,这代表的是队空还是队满呢?

解决这种问题的常见做法是这种:

方法一 : 使用一标记,用以区分这样的易混淆的情形, 重新定义一个变量, 用于存储队列中数据个数。

方法二 : 牺牲一个元素空间。当front和rear相等时,为空。当rear的下一个位置是front时。为满


 代码实现 : 

package dataStructure.circleArray;

import java.lang.reflect.Array;

/**
 * @author hctrl
 * @date 2021/8/12 20:14
 */
public class CircleArray<T> {


	private Integer size;

	private Integer front;

	private Integer rear;

	private T[] arr;


	public CircleArray(Class<T> type, int length) {
		this.size = length;
		arr = (T[]) Array.newInstance(type, length);
		front = 0;
		rear = 0;
	}

	//判断数组是否满了
	public boolean isFull() {

		
		return (rear + 1) % size == front;
	}

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

	//入队列
	public void push(T t) {

		//判断队列是否已经满了
		if (isFull()) {
			System.out.println("队列已经满了===========");
			return;
		}

		arr[rear] = t;
		rear = (rear + 1) % size;

	}

	//出队列
	public void poll() {

		System.out.println(arr[front]);

		if (isEmpty()) {
			System.out.println("队列为空=====================");
			return;
		}

		front = (front + 1) % size;

	}

	//查看队列中的全部元素  (rear + maxSize - front) % maxSize
	public void showAll() {

		int count = (rear + size - front) % size;
		for (int i = front; i < front + count; i++) {
			System.out.printf("arr[%d] = %d\n", i % size, arr[i % size]);
		}

	}

}

 测试类 : 

package dataStructure.circleArray;

import java.util.Scanner;

/**
 * @author hctrl
 * @date 2021/8/12 20:14
 */
public class CircleArrayTest {


	public static void main(String[] args) {

		CircleArray<Integer> circleArray = new CircleArray<>(Integer.class,7);
		boolean loop = true;

		while (loop){

			System.out.println("=======================================================");
			System.out.println("push: 入队");
			System.out.println("poll: 出队");
			System.out.println("show: 查看全部数据");
			System.out.println("=======================================================");

			Scanner scanner = new Scanner(System.in);
			String choose = scanner.next();
			switch (choose){

				case "push":
					System.out.println("请输入入队的数据==============");
					Scanner scanner1 = new Scanner(System.in);
					int i = scanner1.nextInt();
					circleArray.push(i);
					break;
				case "poll":
					circleArray.poll();
					break;
				case "show":
					circleArray.showAll();
					break;
				default:
					loop = false;
					break;
			}
		}

	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值