队列的链表实现

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

链式队列的出现:存储队列元素的数组大小是固定的,另外,队列的数组实现需要用特殊的方式处理数组(保留一个数组元素用
	于判断数组是否已满),以及索引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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值