我正在尝试创建各种出队方法,但遇到了很大的困难。我怀疑我的基本方法(enqueueFront 和 Rear、dequeueFront 和 Rear)是错误的,因此会在以后产生问题。这是我的基本方法:
public void enqueueFront(T element) {
DLLNode<T> newNode = new DLLNode<T>(element);
if (front == null) {
//newNode.setInfo(element);
front = newNode;
rear = newNode;
}
else {
//newNode.setInfo(element);
newNode.setBack(front);
front.setForward(newNode);
front = newNode;
}
numElements++;
}
public void enqueueRear(T element) {
DLLNode<T> newNode = new DLLNode<T>(element);
if (rear ==null) {
front =newNode;
rear = newNode;
}
else {
rear.setBack(newNode);
newNode.setForward(rear);
rear = newNode;
rear.setBack(newNode);
rear = newNode;
}
numElements++;
}
public T dequeueFront() throws QueueUnderflowException {
if (front==null) {
throw new QueueUnderflowException("dequeueFront attempted on empty deque.");
}
else if (front == rear) {
front = null;
rear = null;
numElements--;
}
else {
front = front.getBack();
front.setForward(null);
numElements--;
}
return null;
}
public T dequeueRear() throws QueueUnderflowException {
if (rear == null) {
throw new QueueUnderflowException("dequeueRear attempted on empty deque.");
}
else if (rear ==front) {
front = null;
rear = null;
numElements--;
}
else {
//int a = (Integer) rear.getInfo();
rear = rear.getForward();
rear.setBack(null);
numElements--;
}
return null;
}
然后我有一个 string() 方法:
public void string() {
if (numElements >1) {
for (int i=0; i<=numElements-1; i++) {
System.out.println(front.getInfo() + "<-->");
T g = front.getInfo();
dequeueFront();
enqueueRear(g);
}
}
if (numElements ==1) {
System.out.println(front.getInfo());
}
if (numElements==0) {
System.out.println("Deque is empty");
}
}
在此之后,我有一些方法应该从双端队列的前面或后面插入一个元素,以便有一个排序的双端队列:
public void insertFront(T element) {
DEQueue<Integer> tempD = new DEQueue<Integer>();
if(numElements==0) {
enqueueFront(element);
}
else {
while (((Integer)element) < (Integer)front.getInfo()) {
tempD.enqueueFront((Integer)front.getInfo());
dequeueFront();
}
tempD.enqueueFront((Integer)element);
for (int i=0; i<=numElements-1; i++) { //REVISE NUMBER OF ELEMENTS
tempD.enqueueRear((Integer)front.getInfo());
dequeueFront();
}
for (int j=0; j<=tempD.size(); j++) {
T x = (T)tempD.dequeueFront();
enqueueRear(x);
}
}
}
public void insertRear(T element) {
DEQueue<Integer> tempD = new DEQueue<Integer>();
if(numElements==0) {
enqueueRear(element);
}
if (numElements ==1) {
enqueueRear(element);
}
else if (numElements >1) {
System.out.println("The Rear is: " + rear.getInfo());
while (((Integer)element) < (Integer)rear.getInfo()) {
int s = (Integer)rear.getInfo();
tempD.enqueueFront(s);
dequeueRear();
}
tempD.enqueueRear((Integer)element);
numElements++;
for (int i=0; i<=numElements-1; i++) { //REVISE NUMBER OF ELEMENTS
int k = (Integer)rear.getInfo();
tempD.enqueueRear(k);
dequeueRear();
}
for (int j=0; j<=tempD.size(); j++) {
T x = (T)tempD.dequeueRear();
enqueueRear(x);
}
}
通过一些更改,我得到了多个异常,例如NullPointerExceptions,使用插入方法时双端队列没有正确排序,我觉得代码太庞大等。