Java Deque algorithm

175 Views Asked by At

I'm fairly new to Java and learning Dequeue at the moment.

I have a pretty easy task, but I'm doing something wrong and would love some help on this specific task and also some tips on how to approach those kind of tasks.

I am given 2 Deques:
charDeque = [a, e, i , o , u, b] (a is head b is tail)
intDeque = [3, 6, 9] (3 is head 9 is tail).

I'm required to set an output of integers and characters from that from top to bottom should look like this : [3, a, 6, e, 9, i, o, u, b] //top to bottom.

Here's my code. My approach is to loop over the two Deques and get the tail with the pollLast(); method and push it to an empty Deque - mergedStack. However, my output is close but not quite there : [o, 9, u, 6, b, 3]. I assuming I have a problem with the while loop, can anyone assist ?

package QueueInterfaceExercise1;

import java.util.ArrayDeque;
import java.util.Deque;

public class Tester {

    public static Deque<Object> mergeQueue(Deque<Integer> intQueue, Deque<Character> charQueue) {
        //Implement your logic here and change the return statement accordingly 
//      System.out.println(intQueue);
    System.out.println(charQueue);
//      [3, 6, 9]
//      [a, e, i, o, u, b]
        Deque<Object> mergedStack = new ArrayDeque<Object>();
//      Object number = intQueue.getLast();
//      System.out.println(number);
//      mergedStack.addLast(number);
        
        while( !intQueue.isEmpty() && !charQueue.isEmpty() ) {
            int number = intQueue.pollLast();
            char letter = charQueue.pollLast();
            mergedStack.push(number);
            mergedStack.push(letter);
        }
        return mergedStack;
    }

    public static void main(String[] args) {
        
        Deque<Integer> integerQueue = new ArrayDeque<Integer>();
        integerQueue.add(3);
        integerQueue.add(6);
        integerQueue.add(9);
        
        Deque<Character> characterQueue = new ArrayDeque<Character>();
        characterQueue.add('a');
        characterQueue.add('e');
        characterQueue.add('i');
        characterQueue.add('o');
        characterQueue.add('u');
        characterQueue.add('b');
        
        Deque<Object> mergedQueue = mergeQueue(integerQueue, characterQueue);
        
        System.out.println("The elements in the merged queue are:");
        for(Object element: mergedQueue)
            System.out.println(element);
        
    }

}
1

There are 1 best solutions below

0
On

Your algorithm is close. Basically, you want to keep consuming elements from either deque while either deque has elements. So you want an or (not an and). Something like,

public static Deque<Object> mergeQueue(Deque<Integer> intQueue, 
        Deque<Character> charQueue) {
    Deque<Object> mergedStack = new ArrayDeque<>();
    while (!intQueue.isEmpty() || !charQueue.isEmpty()) {
        if (!intQueue.isEmpty()) {
            mergedStack.push(intQueue.pop());
        }
        if (!charQueue.isEmpty()) {
            mergedStack.push(charQueue.pop());
        }
    }
    return mergedStack;
}