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