看看,它是一个动态队列实现。
汽车(这仅仅是一个汽车,而不是一个队列节点)
public class Car {
private String driver;
public Car(String driver) {
this.driver = driver;
}
@Override
public String toString() {
return "Car (" + driver + ")";
}
}
QueueForCars(实现一个队列,只有拥有汽车交易)
public class QueueForCars {
private class Node {
Car value;
Node previous;
}
private Node head;
private Node tail;
private int size;
public QueueForCars() {
tail = null;
head = null;
size = 0;
}
public void enqueue(Car value) {
Node newNode = new Node();
newNode.value = value;
newNode.previous = null;
if (isEmpty()) {
head = newNode;
tail = newNode;
} else {
tail.previous = newNode;
tail = newNode;
}
size++;
}
public Car dequeue() {
if (!isEmpty()) {
Car value = head.value;
if (head == tail) {
head = null;
tail = null;
} else {
Node temp = head;
head = head.previous;
temp.previous = null;
}
size--;
return value;
} else {
return null;
}
}
public boolean isEmpty() {
return head == null;
}
public int getSize() {
return size;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if (!isEmpty()) {
Node current = head;
while (current != null) {
if (size == 1) {
sb.append(current.value).append(" <- head/tail\n");
} else if (current == head) {
sb.append(current.value).append(" <- head\n");
} else if (current == tail) {
sb.append(current.value).append(" <- tail\n");
} else {
sb.append(current.value).append("\n");
}
current = current.previous;
}
} else {
sb.append("empty queue!\n");
}
return sb.toString();
}
}
测试(测试实施)
public class Test {
public static void main(String[] args) {
QueueForCars queue = new QueueForCars();
queue.enqueue(new Car("John"));
System.out.println(queue);
queue.enqueue(new Car("Mary"));
System.out.println(queue);
queue.enqueue(new Car("Richard"));
System.out.println(queue);
queue.enqueue(new Car("David"));
System.out.println(queue);
System.out.println();
System.out.println("Dequeued: " + queue.dequeue());
System.out.println(queue);
System.out.println("Dequeued: " + queue.dequeue());
System.out.println(queue);
System.out.println("Dequeued: " + queue.dequeue());
System.out.println(queue);
System.out.println("Dequeued: " + queue.dequeue());
System.out.println(queue);
System.out.println("Dequeued: " + queue.dequeue()); // <- empty queue!
System.out.println(queue);
}
}
如果你想有一个通用实现队列,即,可以处理任何类型的数据队列,您的实现应该是这样的:
队列(通用实现队列)
public class Queue<Type> {
private class Node<Type> {
Type value;
Node<Type> previous;
}
private Node<Type> head;
private Node<Type> tail;
private int size;
public Queue() {
tail = null;
head = null;
size = 0;
}
public void enqueue(Type value) {
Node<Type> newNode = new Node<>();
newNode.value = value;
newNode.previous = null;
if (isEmpty()) {
head = newNode;
tail = newNode;
} else {
tail.previous = newNode;
tail = newNode;
}
size++;
}
public Type dequeue() {
if (!isEmpty()) {
Type value = head.value;
if (head == tail) {
head = null;
tail = null;
} else {
Node<Type> temp = head;
head = head.previous;
temp.previous = null;
}
size--;
return value;
} else {
return null;
}
}
public boolean isEmpty() {
return head == null;
}
public int getSize() {
return size;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if (!isEmpty()) {
Node<Type> current = head;
while (current != null) {
if (size == 1) {
sb.append(current.value).append(" <- head/tail\n");
} else if (current == head) {
sb.append(current.value).append(" <- head\n");
} else if (current == tail) {
sb.append(current.value).append(" <- tail\n");
} else {
sb.append(current.value).append("\n");
}
current = current.previous;
}
} else {
sb.append("empty queue!\n");
}
return sb.toString();
}
}
水果(另一类测试通用队列)
public class Fruit {
private String name;
private String color;
public Fruit(String name, String color) {
this.name = name;
this.color = color;
}
@Override
public String toString() {
return "Fruit (" + name + " is " + color + ")";
}
}
测试(试验车水果通用队列)
public class Test {
public static void main(String[] args) {
Queue<Car> queueForCars = new Queue<>();
queueForCars.enqueue(new Car("John"));
System.out.println(queueForCars);
queueForCars.enqueue(new Car("Mary"));
System.out.println(queueForCars);
queueForCars.enqueue(new Car("Richard"));
System.out.println(queueForCars);
queueForCars.enqueue(new Car("David"));
System.out.println(queueForCars);
System.out.println();
Queue<Fruit> queueForFruits = new Queue<>();
queueForFruits.enqueue(new Fruit("Apple", "red"));
System.out.println(queueForFruits);
queueForFruits.enqueue(new Fruit("Banana", "yellow"));
System.out.println(queueForFruits);
queueForFruits.enqueue(new Fruit("Lime", "green"));
System.out.println(queueForFruits);
System.out.println();
}
}
我的一些代码是多余的,例如,对于队列的构造,因为它们设置的默认值的队列成员,但我认为这种方式更好地了解你何时学习。我希望它能帮助你!
你的车是队列的节点。也许如果你以不同的方式对它进行建模,那会更好。我将发布一个汽车排队版本。测试一下,看看我的出队方法。 – davidbuzatto