欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

队列的链表实现

程序员文章站 2024-03-18 11:13:10
...

前面我们看了队列的数组实现,本文来看看用链表实现队列的方法。

链式队列的出现:存储队列元素的数组大小是固定的,另外,队列的数组实现需要用特殊的方式处理数组(保留一个数组元素用
    于判断数组是否已满),以及索引front和rear(计算front/rear时用(front/rear + 1 )% maxSize 操作)。而队列
    的链表实现简化了数组实现的许多特殊情况,并且动态分配内存,所以队列永远也不会满。


看以下程序:

/** 链表类 */
class Link{

    /** 结点类,用于初始化结点 */
    class Entry{
        int data;
        Entry next;
        public Entry(){
            data = -1;
            next = null;
        }
        public Entry(int data){
            this.data = data;
            next = null;
        }
    }

    /** 定义头尾索引 */
    public Entry front = null;
    public Entry rear = null;
    public int usedSize = 0;

    /** 判断队列是否为空 */
    public boolean isEmpty(){
        return usedSize == 0;
    }

    /** 插入元素 */
    public void insetTail(int data) {
        // 若此时队列为空,则直接插入,头尾索引指向该结点
        if (isEmpty()) {
            rear = new Entry(data);
            front = rear;
            // 若队列不为空则尾索引后移指向新结点
        } else {
            rear.next = new Entry(data);
            rear = rear.next;
        }
        // 已用长度每次加1
        usedSize++;
    }

    /** 数据出队列操作 */
    public void pop(){
        // 若队列为空则直接结束该操作
        if(isEmpty()){
            return;
        }
        // 若不为空则头索引指向第二个结点
        Entry cur = front;
        front = front.next;
        // 第一个结点置为null,便于垃圾回收
        cur.next = null;
        // 已用长度每次减1
        usedSize--;
    }

    /** 获取队列头元素操作 */
    public int getTop(){
        // 若队列为空则返回-1
        if (isEmpty()){
            return -1;
        }
        // 若不为空则返回头索引对应的结点数据
        return front.data;
    }

    /** 队列元素的遍历输出 */
    public void print(){
        Entry cur = front;
        while (cur != null){
            System.out.print(cur.data + " ");
            cur = cur.next;
        }
        System.out.println();
    }
}

/** 主类*/
public class LinkQueue {
    public static void main(String[] args){
        // 动态制作一个链式队列
        Link link = new Link();
        for (int x = 0; x < 5; x++){
        link.insetTail(x);
        }

        System.out.print("队列里的元素是:");
        link.print();
        System.out.println("队列头元素是 :"+ link.getTop());
        System.out.println("队列长度是 :" + link.usedSize);
        System.out.println("==================" );

        link.pop();
        System.out.print("执行一次出队操作后队列里的元素是:");
        link.print();
        System.out.println("执行一次出队操作后队列头元素是 :"+ link.getTop());
        System.out.println("执行一次出队操作后队列长度是 :" + link.usedSize);
    }
}

以上程序的输出结果是:

        队列里的元素是:0 1 2 3 4 
        队列头元素是 :0
        队列长度是 :5
        ==================
        执行一次出队操作后队列里的元素是:1 2 3 4 
        执行一次出队操作后队列头元素是 :1
        执行一次出队操作后队列长度是 :4
相关标签: 数据结构