数组---队列的顺序存储实现

问题:数组是一个能够存储多个元素的相同类型的容器,那么我们怎样能够实现用数组完成队列的功能呢?

首先我们应该先了解一下队列的特性:
        队列是一种特殊的线性表,他的特殊之处就在于只能够在表的头部分进行删除操作,而在表的最后部分进行插入操作,所以有先进先出之说。我们知道数组的主要功能是查找功能,增删改对于数组而言相对于链表进行增删改是比较麻烦的,但是用来实现增删改操作还是可行的。

首先我们得考虑一个问题,就是在队列为空时出队操作和取队首元素操作时都是不合理的,此时会产生异常,所以我们自定义一个异常;

自定义异常:

package cn.jxlg.seq;

/**
 * 队列为空时,出队或取队首元素时抛出此异常
 */
public class QueueEmptyException extends RuntimeException{
    public QueueEmptyException(String err){
        super(err);
    }
}

 然后就是完成队列中各种常用到的操作,我们可以先定义一个接口,使得代码更加的安全

接口的定义:

package cn.jxlg.seq;

/**
 * 队列的功能接口
 */
public interface Queue {
    //获取元素的大小
    public int getSize();
    //判断队列是否为空
    public boolean isEmpty();
    //入队
    public void enqueue(Object obj);
    //出队
    public Object dequeue() throws QueueEmptyException;
    //获取首元素
    public Object peek() throws QueueEmptyException;
}

   

接口的功能实现:     

public class Queue {
    private int[] arr;//队
    private int length;//队的长度
    private int size;//队的当前长度
    public Queue(){
        arr=new int[5];
        this.length=5;
    }
    public Queue(int length){
        arr=new int[length];
        this.length=length;
    }

    //验证
    public void check(){
        if (size>=length){
            int [] newArr=new int[length+10];
            System.arraycopy(arr,0,newArr,0,length);
            arr=newArr;
            length+=10;
        }
    }

    //入队
    public void add(int num){
        check();
        arr[size]=num;
        size++;
    }

    //出队
    public int remove(){
        int num=arr[0];
        for (int i=0;i<size-1;i++){
            arr[i]=arr[i+1];
        }
        arr[size-1]=0;
        size--;
        return num;
    }

    //获取当前队的长度
    public int size(){
        return size;
    }
}

  

发布了42 篇原创文章 · 获赞 6 · 访问量 2978

猜你喜欢

转载自blog.csdn.net/qq_44666176/article/details/98721736