环形队列的实现

由于队列存在空间不能重复利用的问题而造成无法二次插入数据,所以产生了环形队列

在这里插入图片描述
代码实现:

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;
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值