20162302队列课下作业

20162302 队列课下作业

主要内容:

一、补全课上代码,用链表实现队列

二、单步跟踪排队情况


一、补全课上代码,用链表实现队列

为了实现模拟票务柜台排队功能首先要构造一个类来实现队列。相对而言,用链表实现队列在操作上要简单一些。所以课本上先用LinkedQueue来实现队列。

课本上已经给出了一个未完成的LinkedQueue类以及Queue接口

1062717-20171016093914599-1384394764.png
1062717-20171016094037959-173694940.png

但是这个方法是不能直接拿来用的,因为它只有将数据添加到队列的enquete()方法,没有将数据移出的dequeue()方法以及返回首位的first()方法等很多重要的部分还没有实现。

课本上使用到了LinearNode类,在我完成此项之前并未把课本上的类放到项目里面,所以我就自己在LinkedQueue里面建立了一个LinearNode类。

public class LinearNode<T> {
        private T data;
        private LinearNode next;

        private LinearNode(T dataPortion) {
            data = dataPortion;
            next = null;
        }
    }

因为结构和课本上的不一样,所以在调用的时候也要做出修改。课本上是通过rear.setNext(node);来设定next指针的,因为没有setNext(),在我的类里面就要使用rear.next = node;来设定指针。

@Override
    public void enqueue(T element) {
        LinearNode<T> node = new LinearNode<T>(element);
        
        if (count == 0)
            front = node;
        else
            rear.next = node;
        rear = node;
        count++;
    }

这次补全代码不是很顺利,两次抛出NullPointerException异常,也就是空指针异常

  • 第一次是在测试仅调用enquete()添加数据到队列中调用toString()打印队列全部数据的时候抛出了异常

1062717-20171016102134724-276371483.png

经过debug分析,问题出在遍历队列的for循环上:数据的编码是从1开始数的,而不是像数组一样从零开始数

1062717-20171016102348724-1152656479.png

  • 第二次出现是在调用dequeue()删除数据以后调用toString()打印队列全部数据的时候抛出了异常

1062717-20171016104329177-340604309.png

这次for循环是没有问题,但是在遍历的时候长度不对,也就说明问题出现在count上。在删除数据完成以后没有及时的做差,导致了数据个数和count不符

 @Override
    public T dequeue() {
        LinearNode data = new LinearNode(front.data);
        data.next = front.next;
        if (count == 0) {
            System.out.println("Error");
            return null;
        } else {
            if (count == 1)
                rear = null;
            front = front.next;
        }
        return (T)data.data;
    }

二、单步跟踪排队情况

1062717-20171016114500099-1766689072.png

转载于:https://www.cnblogs.com/yangjingdian/p/7674145.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值