简体   繁体   English

Java双端队列算法

[英]Java Deque algorithm

I'm fairly new to Java and learning Dequeue at the moment.我对 Java 还很陌生,目前正在学习 Dequeue。

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:我有 2 个双端队列:
charDeque = [a, e, i , o , u, b] (a is head b is tail) charDeque = [a, e, i , o , u, b] (a 是头 b 是尾)
intDeque = [3, 6, 9] (3 is head 9 is tail). intDeque = [3, 6, 9](3 是头部,9 是尾部)。

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.我需要从上到下设置整数和字符的输出应该如下所示: [3, a, 6, e, 9, i, o, u, b] //从上到下。

Here's my code.这是我的代码。 My approach is to loop over the two Deques and get the tail with the pollLast();我的方法是遍历两个双端队列并使用 pollLast(); 获取尾部。 method and push it to an empty Deque - mergedStack.方法并将其推送到一个空的双端队列-mergedStack。 However, my output is close but not quite there : [o, 9, u, 6, b, 3].但是,我的输出很接近但不完全存在:[o, 9, u, 6, b, 3]。 I assuming I have a problem with the while loop, can anyone assist ?我假设我的 while 循环有问题,有人可以帮忙吗?

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);
        
    }

}

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 ).所以你想要一个or (不是一个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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM