0

我正在尝试创建各种出队方法,但遇到了很大的困难。我怀疑我的基本方法(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,使用插入方法时双端队列没有正确排序,我觉得代码太庞大等。

4

0 回答 0