顺序队列的实现(Java)


/**
 * 基于数组实现的对列
 */
public class ArrayQueue {
    private String item[];//字符串数组实现队列
    private int n=0;//对列元素个数
    private int head=0;//对头元素下标
    private int tail=0;//队尾元素下标

    //初始化
    public ArrayQueue(){}
    public ArrayQueue(int capacity){
       this.item = new String[capacity];//申请一个固定大小capacity 的字符串数组空间
        this.n=capacity;
    }
    //入队
    public boolean enQueue(String item){
        if(tail==n) return false;
        this.item[tail++]=item;
        return true;
    }
    //出队
    public String deQueue(){
        if(head==tail) return null;
        String he=item[head++];
        return he;
    }
}

  @Test
    public void test(){
        ArrayQueue aq=new ArrayQueue(3);
        aq.enQueue("1");
        aq.enQueue("2");
        aq.enQueue("3");
        System.out.println(aq.deQueue());
        System.out.println(aq.deQueue());
        System.out.println(aq.deQueue());
        aq.enQueue("5");
        System.out.println(aq.deQueue());
    }

 在这当中可以明显的看出来:

当入队在出队后,再添加元素,就会返回null ,这时的head ,和tail 指向同一个位置说明次队列为空,也就不能再填加进去元素了。

为解决这个问题,我们可以把数组的元素向前搬移,实际上,我们并不需要在每次出队时搬移数据。只有当 tail 指针移动到数组的最右边是时,如果有新的数据要入队,我们在集中触发一次元素搬移操作将 head 指针到  tail  指针的数据,整体搬移到数组,从零开始的位置。

基于这个思想,我把入队操作做了优化:

    public boolean enQueue(String item){
        if(tail==n) {
            if (head==0)    return false;//tail==n&& head==0 ,表示对列满
            for(int i=head;i<tail;i++){
                this.item[i-head]=this.item[i];//数据搬移到前面
            }
            tail=tail-head;
            head=0;
        }
        this.item[tail++]=item;
        return true;
    }

 

 

当我再次测试时就可以重复添加数据

如图为再次测试结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝闻道 ||

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值