数据结构与算法(十一)数组实现循环队列

这一次我们使用数据实现一个循环队列,循环队列除非扩容,否则数组中的空间可以重复使用,且不用移动数组中元素的位置,是一个性能比较好的数据结构。它需要注意的地方就是如果当前队列头部元素如果所在的下标不是0,且队尾的元素已经是数组末尾,则需要对数组前部空间的重复利用,需要使用(tail+1)% dataArray.length 计算出新元素应该放置的位置。

扩容的时候我是创建一个新的临时数组并将旧有的元素依次放置。

如果有不对的地方烦请各位大佬留言指正。

代码如下:

public class MyCircleQueue {
    private String[] dataArray;
    private int size;
    private int head;
    private int tail;

    public MyCircleQueue(){
        dataArray=new String[8];
        size=0;
        head=0;
        tail=0;
    }
    public MyCircleQueue(int length){
        dataArray=new String[length];
        size=0;
        head = 0;
        tail=0;
    }

    //往队列尾部添加一个元素
    public void append(String data){
        //如果队列已满,则扩容
        if(size>=dataArray.length){
            expand();
            head = 0;
            tail=size-1;
        }
        if(size==0){
            dataArray[0]=data;

        }else{

            dataArray[(tail+1)% dataArray.length]=data;
            tail++;
        }
        size++;
    }

    //从队列头部出一个元素
    public String remove1(){
        if(size<1){
            System.out.println("队列为空");
            return null;
        }else{
            String result = dataArray[head];

            if(head+1<dataArray.length){
                head = head+1;
            }else{
                head = head+1-dataArray.length;
            }
            size--;

            return result;
        }
    }
    public int size(){
        return size;
    }

    public void expand(){
        String[] tempArray = new String[dataArray.length*2];
        for(int i = 0;i<size;i++){
            if(head+i<dataArray.length){
                tempArray[i]=dataArray[head+i];
            }else{
                tempArray[i]=dataArray[head+i-dataArray.length];
            }
        }
        dataArray=tempArray;
    }
}

然后通过测试方法,验证队列的加减和扩容:

class MyCircleQueueTest {
    public static void main(String[]args){
        MyCircleQueue queue = new MyCircleQueue(2);

        queue.append("111");
        queue.append("222");
        queue.append("333");
        queue.append("444");
        queue.append("5");
        queue.append("6");
        queue.append("7");
        queue.append("8");
//        queue.append("9");

        String a= queue.remove1();
        String b = queue.remove1();
        String c = queue.remove1();
        String d = queue.remove1();
        String e = queue.remove1();
        String f = queue.remove1();
        String g = queue.remove1();

        queue.append("10");
        queue.append("11");
        queue.append("12");
        queue.append("13");
        queue.append("14");
        queue.append("15");
        queue.append("16");
        queue.append("17");
    }
}

打完,手工!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值