数据结构与算法学习笔记2--------环形队列

为什么要有环形队列?

因为普通的队列空间无法复用,单纯的将rear,front两个指针进行增加,导致出队列的数据所占的空间没法使用,这样的话队列的空间会越来越少,于是出现了环形队列.

环形队列的变化

  • 首先,环形队列中rear,和front指代的含义发生了变化:

    rear指向队列最后一个数据的后一个位置;
    front指向队列的第一个数据的位置

其次,环形队列中进行约定,预留一个空间,也就是rear指向的那个位置,这个位置不能存放数据,当其他位置已经存放过数据之后,就认为这个队列已满了
这时候就认为队列已满了](https://img-blog.csdnimg.cn/20190727095220810.png)
在这里插入图片描述

代码实现

public class CircleArrayQueueDemo {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	//进行测试
	
	CircleArrayQueue queue = new CircleArrayQueue(4);
	char key = ' ';//接收用户输入
	Scanner in = 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 = in.next().charAt(0);
		switch(key) {
		case 's':
			queue.showQueue();
			break;
		case 'a':
			System.out.println("请输入一个数");
			int value = in.nextInt();
			queue.addQueue(value);
			break;
		case 'g':
			try {
				int result = queue.getQueue();
				System.out.printf("取出的数据是%d\n",result);
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
			break;
		case 'h':
			try {
				queue.headQueue();
			} catch (Exception e) {
				// TODO: handle exception
				System.out.println(e.getMessage());
			}
			break;
		case 'e':
			in.close();
			break;
		default:
			break;
		}
			
	}
	System.out.println("程序退出");
	
	
}

}

//用数组模拟队列-编写一个环形队列

class CircleArrayQueue{
private int maxSize;//表示数组最大容量 在环形队列中,最多只能有maxSize-1 个数据存在
private int front;//队列头 指向第一个元素
private int rear;//指向队尾元素的后一个位置
private int[] arr;//该数组用于存放数据

//创建队列的构造器

public CircleArrayQueue(int arrMaxsize) {
	this.maxSize = arrMaxsize;
	this.arr = new int[arrMaxsize];
	front = 0;
	rear = 0;
}

//判断队列是否满

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

//判断队列是否为空

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

//向队列添加数据
public void addQueue(int n) {
	//首先要判断队列是否满了
	if(isFull()) {
		System.out.println("队列已满,不能添加数据");
		return;
	}
	
	arr[rear] = n;
	//将rear后移
	
	rear = (rear+1)%maxSize;
}

//获取队列数据,出队列
public int getQueue() {
	//判断队列是否为空
	if(isEmpty()) {
		//通过抛出异常处理
		throw new RuntimeException("队列空,不能取数据");
	}
	
	//front指向队列的第一个元素
	//1.先把front对应的值保存到一个临时变量
	//2.将front后移,考虑去摸
	//3.将临时保存的变量返回
	int temp = arr[front];
	front = (front+1)%maxSize;
	return temp;
}

//显示队列所有数据的方法

public void showQueue() {
	if(isEmpty()) {
		System.out.println("队列空,无数据");
		return;
	}
	//从front开始遍历 
	for(int i=front;i<front+size();i++) {
		System.out.printf("arr[%d] = %d ",i%maxSize,arr[i%maxSize]);
	}
}
//求出当前队列有效数据个数的方法
public int size() {
	return (rear+maxSize-front)%maxSize;
}
//显示队列头部数据
public void headQueue() {
	if(isEmpty()) {
		System.out.println("队列空无数据");
	}
	System.out.println("头部数据为:"+arr[front]);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值