由于队列存在空间不能重复利用的问题而造成无法二次插入数据,所以产生了环形队列
代码实现:
package 数据结构;
/**
* Created with IntelliJ IDEA.
*
* @Auther: 风离
* @Date: 2020/10/20/16:13
* @Description:
*/
public class 自己的环形队列 {
public static void main(String[] args) {
CircleArr c1=new CircleArr(10);
//添加9个元素,10个容量因为留了一个容量作为“约定”,所以最大只能存9个元素
for(int i=0;i<9;i++)
{
c1.addQueue(10);
System.out.println("-----------------------------------");
System.out.println("头指针指向:"+c1.getFront());
System.out.println("尾指针指向"+c1.getRear());
}
System.out.println();
c1.showQueue();
System.out.println();
System.out.print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println();
//取出8个元素,还剩一个元素
for(int i=0;i<8;i++)
{
c1.getQueue();
System.out.println("-----------------------------------");
System.out.println("头指针指向:"+c1.getFront());
System.out.println("尾指针指向:"+c1.getRear());
}
System.out.println();
c1.showQueue();
System.out.println();
System.out.print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println();
//加一个元素
c1.addQueue(20);
System.out.println();
c1.showQueue();
System.out.println();
System.out.println("头指针指向:"+c1.getFront());
System.out.println("尾指针指向:"+c1.getRear());
System.out.println();
//减一个元素
c1.getQueue();
System.out.println("头指针指向:"+c1.getFront());
System.out.println("尾指针指向:"+c1.getRear());
//再减一个元素
c1.getQueue();
System.out.println("头指针指向:"+c1.getFront());
System.out.println("尾指针指向:"+c1.getRear());
//在减少则报异常
c1.getQueue();
System.out.println("头指针指向:"+c1.getFront());
System.out.println("尾指针指向:"+c1.getRear());
}
}
class CircleArr{
/**
* maxsize:数组最大容量
* front:队列头指针 :指向队列头的第一个元素
* rear:队列尾指针 :指向队列尾的元素的后一个位置
* arr:队列数组
*/
private int maxsize;
private int front;
private int rear;
private int []arr;
//getter and setter
public int getMaxsize() {
return maxsize;
}
public void setMaxsize(int maxsize) {
this.maxsize = maxsize;
}
public int getFront() {
return front;
}
public void setFront(int front) {
this.front = front;
}
public int getRear() {
return rear;
}
public void setRear(int rear) {
this.rear = rear;
}
public int[] getArr() {
return arr;
}
public void setArr(int[] arr) {
this.arr = arr;
}
//构造方法
public CircleArr(int maxsize) {
this.maxsize = maxsize;
arr=new int[maxsize];
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("队列已满,不能添加数据");
}
else{
arr[rear]=n;
rear=(rear+1)%maxsize;
}
}
public int getQueue(){
if(isEmpty())
{ //会直接导致return
throw new RuntimeException("队列中无数据,取出失败");
}
else{
int value=arr[front];
front=(front+1)%maxsize;
return value;
}
}
public void showQueue(){
if(isEmpty())
{
System.out.println("队列为空,没有数据");
}
else{
for(int i=front;i<front+size();i++)
{
System.out.print(arr[i%maxsize]+"\t");
}
}
}
/**
* 求出当前队列中有效的元素个数
*/
public int size()
{
return (rear+maxsize-front)%maxsize;
}
}