数据结构--队列

来源:互联网 发布:linux单用户模式怎么进 编辑:程序博客网 时间:2024/06/05 11:17

1 队列是只允许在一段进行插入操作,在另外一端进行删除操作的线性表。
1.1顺序存储结构。约定front指针指向头元素的前一个元素,rear指向队尾元素。

public class QueueCustom<E> {    /**     * 队列最大节点数     */    private static final Integer MAX_SIZE = 100;    /**     * 存储数据域     */    private Object[] data;    /**     * 指向队头元素的前一个元素     */    private Integer front;    /**     * 指向队尾元素     */    private Integer rear;    /**     *      */    public QueueCustom() {        front = -1;        rear = -1;        data = new Object[MAX_SIZE];    }    /**     * 入列操作     *      * @param x     */    public void EnQueue(E x) {        if ((rear + 1) % MAX_SIZE == front) {            System.out.println("队列已满");        } else {            rear = (rear + 1) % MAX_SIZE;            data[rear] = x;        }    }    /**     * 出列     *      * @return 出列的数据域     */    @SuppressWarnings("unchecked")    public E DeQueue() {        if (rear != front) {            front = (front + 1) % MAX_SIZE;            return (E) data[front];        } else {            return null;// 队列为空        }    }    /**     * 获取出列的数据域,不移动尾指针域     *      * @return 出列的数据域     */    @SuppressWarnings("unchecked")    public E getTopQueue() {        if (rear != front) {            int temp;            temp = (front + 1) % MAX_SIZE;            return (E) data[temp];        } else {            return null;        }    }    /**     * 判断是否为空     *      * @return 为空返回true,不为空返回false     */    public boolean isEmpty() {        if (rear == front) {            return true;        } else {            return false;        }    }    public static void main(String[] args) {        QueueCustom sb = new QueueCustom();        sb.EnQueue(1);        sb.EnQueue(2);        sb.EnQueue(3);        sb.EnQueue(4);        sb.EnQueue(5);        System.out.println(sb.DeQueue());        System.out.println(sb.DeQueue());        System.out.println(sb.DeQueue());        System.out.println(sb.DeQueue());        System.out.println(sb.DeQueue());    }}

1.2 链接存储结构
定义节点结构与单链表类似,一个数据域,一个指向下一个节点的指针。

public class QueueLinkCustom<E> {    /**     * 头节点     */    private Node<E> headNode = null;    /**     * 指向队头的指针, front指向一个固定的头节点     */    private Node<E> front;    /**     * 指向队尾的指针     */    private Node<E> rear;    /**     * 各个节点结构 数据域和一个指向下一个节点的指针     */    private class Node<E> {        private E data;        /**         * 指向下一个节点         */        private Node<E> next;        public Node(E data, Node<E> next) {            this.data = data;            this.next = next;        }    }    public QueueLinkCustom() {        headNode = new Node<E>(null, null);        rear = front = headNode;    }    /**     * 入队操作     *      * @param x     *            入队的数据域     */    public void EnQueue(E e) {        Node<E> s = new Node<E>(e, null);        rear.next = s;        rear = s;    }    /**     * 出队操作     *      * @return 出列节点的数据域     */    public E DeQueue() {        E nodeData = front.next.data;// front指向一个固定的头节点        front.next = front.next.next;        return nodeData;    }    /**     *      * @return     */    public E getTop() {        return front.data;    }    /**     * 判断队列是否为空,     *      * @return 为空返回true ,不为空返回false     */    public boolean isEmpty() {        return front == rear;    }    public static void main(String[] args) {        // TODO Auto-generated method stub        QueueLink sb = new QueueLink();        sb.EnQueue(1);        sb.EnQueue(2);        sb.EnQueue(3);        System.out.println(sb.DeQueue());        System.out.println(sb.DeQueue());        System.out.println(sb.DeQueue());    }}
原创粉丝点击