20162302队列课下作业

20162302 队列课下作业

主要内容:

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

二、单步跟踪排队情况


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

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

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


但是这个方法是不能直接拿来用的,因为它只有将数据添加到队列的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()打印队列全部数据的时候抛出了异常

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

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

这次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;
    }

二、单步跟踪排队情况

posted @ 2017-10-15 20:55  20162302  阅读(179)  评论(0编辑  收藏  举报