优化这段代码package park; //设计链队数据结构及其基本操作 public class Queue { private QueueNode front;//队首指针 private QueueNode rear;//队尾指针 //链队列类的构造函数 public Queue() { front=rear=null; } //队列置空 public void clear() { front=rear=null; } //队列置空 public boolean isEmpty() { return front==null; } //求队列长度 public int length() { QueueNode p=front; int length=0; while(p!=null) { p=p.next;//指针下移 ++length;//计数器+1 } return length; } //取出队首元素 public Object peek() { if(front!=null)//队列非空 return front.car;//返回队首结点的数据域值 else return null; } //车辆入队 public boolean offer(Car car) { QueueNode p=new QueueNode(car);//初始化新结点 if(front!=null)//队列非空 { rear.next=p; rear=p;//改变队尾位置 } else { front=rear=p; } return true; } public Object poll() { if(front!=null)//队列非空 { QueueNode p=front;//p指向队首结点 front=front.next;//队首结点出列 if(p==rear)//被删除的结点是队尾结点时 rear=null; return p.car;//返回队首结点的数据域值 } else return null; } //输出队列中的所有数据元素(从头到尾) public void display() { QueueNode p=front; while(p!=null) { System.out.println(p.car+","); p=p.next; } } }
时间: 2023-12-03 09:47:48 浏览: 82
可以考虑以下几个优化点:
1. 使用泛型
在Queue类中使用泛型,以支持不同类型的数据元素。修改Queue类声明如下:
```
public class Queue<T> {
private QueueNode<T> front;//队首指针
private QueueNode<T> rear;//队尾指针
//...
}
```
2. 使用单向链表
Queue类中使用的是双向链表,但实际上队列只需要一个方向的指针即可。因此,可以将QueueNode类改为单向链表节点,修改QueueNode类声明如下:
```
public class QueueNode<T> {
public T car;//数据域
public QueueNode<T> next;//指针域
public QueueNode(T car) {
this.car = car;
next = null;
}
}
```
同时,修改Queue类中的offer和poll方法实现,去掉对prev指针的处理。
3. 优化长度计算
在length方法中,每次循环都需要对计数器加一,可以改为使用for循环遍历。
修改length方法实现如下:
```
public int length() {
int length = 0;
for (QueueNode<T> p = front; p != null; p = p.next) {
length++;
}
return length;
}
```
4. 优化入队操作
在offer方法中,每次插入新节点都需要判断队列是否为空,可以将这部分代码提取到Queue类的构造函数中,初始化时就将队首和队尾指针都设为null。
修改Queue类声明和构造函数实现如下:
```
public class Queue<T> {
private QueueNode<T> front;//队首指针
private QueueNode<T> rear;//队尾指针
public Queue() {
front = rear = null;
}
//...
}
```
同时,在offer方法中,可以直接将新节点插入到rear节点后面,再将rear指向新节点。如果队列为空,直接将front和rear都指向新节点。
修改offer方法实现如下:
```
public boolean offer(T car) {
QueueNode<T> p = new QueueNode<>(car);//初始化新结点
if (front != null) {//队列非空
rear.next = p;
rear = p;//改变队尾位置
} else {
front = rear = p;
}
return true;
}
```
5. 优化出队操作
在poll方法中,需要先判断队列是否为空,可以将这部分代码提取到isEmpty方法中,避免重复判断。
修改isEmpty方法实现如下:
```
public boolean isEmpty() {
return front == null;
}
```
同时,在poll方法中,可以直接将front指向下一个节点即可。如果队列为空,直接返回null。
修改poll方法实现如下:
```
public T poll() {
if (!isEmpty()) {//队列非空
QueueNode<T> p = front;//p指向队首结点
front = front.next;//队首结点出列
if (p == rear) {//被删除的结点是队尾结点时
rear = null;
}
return p.car;//返回队首结点的数据域值
} else {
return null;
}
}
```
6. 优化显示操作
在display方法中,每次循环都需要输出一个逗号,可以改为先输出第一个节点的数据,再循环输出后面的节点数据并加上逗号。
修改display方法实现如下:
```
public void display() {
if (front != null) {
System.out.print(front.car);
QueueNode<T> p = front.next;
while (p != null) {
System.out.print("," + p.car);
p = p.next;
}
}
System.out.println();
}
```
阅读全文