《数据结构(C语言版)》- 队列

来源:互联网 发布:java excel 合并 编辑:程序博客网 时间:2024/05/22 02:49

队列是一种先进先出(FIFO)的线性表,恰好与栈相反。队列只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端叫做队尾,允许删除的一端称为队头。假设队列为q=(a1,a2,..,an),那么,a1就是队头元素,an则是队尾元素。队列在程序设计中也经常出现。一个最典型的例子就是操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行。如果运行的结果都需要通过通道输出,那就要按请求输出的先后次序排队。

队列的抽象数据类型定义如下:

ADT Queue{数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=1,2, …,n }            约定其中a1为队列头,an为队列尾。基本操作:    InitQueue( &Q )      操作结果:构造一个空队列Q。    DestroyQueue ( &Q )      初始条件:队列Q已存在。      操作结果:销毁队列Q。    ClearQueue ( &Q )      初始条件:队列Q已存在。      操作结果:将Q清为空队列。    QueueEmpty( Q )      初始条件:队列Q已存在。      操作结果:若Q为空队列,则返回TRUE,否则返回FALSE。    QueueLength( Q )      初始条件:队列Q已存在。      操作结果:返回Q的数据元素个数,即队列的长度。    GetHead( Q, &e )      初始条件:队列Q已存在且非空。      操作结果:用e返回Q的队头元素。    EnQueue( &Q, e )      初始条件:队列Q已存在。      操作结果:插入元素e为Q的新的队尾元素。    DeQueue( &Q, &e )      初始条件:队列Q已存在且非空。      操作结果:删除Q的队头元素,并用e返回其值。QueueTraverse( Q, visit() )      初始条件:队列Q已存在且非空。      操作结果:从队头到队尾依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。}ADT Queue

下面则是队列的Java实现:

/** * 队列接口的实现类 */public class QueueImpl<T> implements Queue<T>{    /**     * 队列对象     */    private Object[] queue = null;    /**     * 队列长度     */    private int len;    /**     * 队列最大长度     */    private int maxLen;    /**     * 构造一个空队列     * @param size     */    public void InitQueue(int size){        this.queue = new Object[size];        this.len = 0;        this.maxLen = size;    }    /**     * 销毁队列     */    public void DestroyQueue(){        if(this.queue != null){            this.queue = null;            this.maxLen = 0;            this.len = 0;        }else{            throw new IllegalArgumentException("队列不存在");        }    }    /**     * 清空队列     */    public void CLearQueue(){        if(this.queue != null){            this.queue = new Object[this.maxLen];            this.len = 0;        }else{            throw new IllegalArgumentException("队列不存在");        }    }    /**     * 判断队列是否为空     * @return     */    public Boolean QueueEmpty(){        if(this.queue != null)            if(this.len != 0)                return false;            else                return true;        else            throw new IllegalArgumentException("队列不存在");    }    /**     * 求队列的长度     * @return     */    public int QueueLength(){        if(this.queue != null){            return this.len;        }else            throw new IllegalArgumentException("队列不存在");    }    /**     * 返回队列的队头元素     * @return     */    public T GetHead(){        if(this.queue != null){            return (T) this.queue[0];        }else            throw new IllegalArgumentException("队列不存在");    }    /**     * 插入元素为新的队尾元素     * @param e     */    public void EnQueue(T e){        if(this.queue != null && this.len != this.maxLen){            this.queue[this.len] = e;            this.len++;        }else            throw new IllegalArgumentException("队列不存在或者已满");    }    /**     * 删除队列的队头元素     * @return     */    public T DeQueue(){        if(this.queue != null && this.len > 0){            Object[] newQueue = new Object[this.maxLen];            for(int i = 1;i < this.len;i++)                newQueue[i-1] = this.queue[i];            T e = (T) this.queue[0];            this.queue = newQueue;            this.len = newQueue.length;            return e;        }else            throw new IllegalArgumentException("队列不存在或者为空");    }    /**     * 从队头到队尾依次对队列中每个元素调用函数visit()     */    public void QueueTraverse(){        Object[] newQueue = new Object[this.maxLen];        for(int i = 0;i < this.len;i++)            newQueue[i] = visit((T) this.queue[i]);        this.queue = newQueue;    }    /**     * visit函数     * @param e     */    public T visit(T e){        return (T) e.toString();    }    public static void main(String[] args) {        Queue queue = new QueueImpl();        queue.InitQueue(5);//初始化队列        //queue.DestroyQueue();//销毁队列        //queue.CLearQueue();//清空队列        Boolean flag = queue.QueueEmpty();//判断队列是否存在        int len = queue.QueueLength();//求队列的长度        queue.EnQueue(3);//插入新元素        queue.EnQueue(4);//插入新元素        queue.EnQueue(5);//插入新元素        queue.EnQueue(6);//插入新元素        queue.EnQueue(7);//插入新元素        queue.DeQueue();//删除队头元素        queue.QueueTraverse();//从队头到队尾    }}/** * 队列接口 */public interface Queue<T> {    /**     * 构造一个空队列     * @param size     */    void InitQueue(int size);    /**     * 销毁队列     */    void DestroyQueue();    /**     * 清空队列     */    void CLearQueue();    /**     * 判断队列是否为空     * @return     */    Boolean QueueEmpty();    /**     * 求队列的长度     * @return     */    int QueueLength();    /**     * 返回队列的队头元素     * @return     */    T GetHead();    /**     * 插入元素为新的队尾元素     * @param e     */    void EnQueue(T e);    /**     * 删除队列的队头元素     * @return     */    T DeQueue();    /**     * 从队头到队尾依次对队列中每个元素调用函数visit()     */    void QueueTraverse();    /**     * visit函数     * @param e     */    T visit(T e);}