题目的主要信息:

  • 交替弹出队首队尾元素

具体做法:

deque是双端队列,可以从队首弹出也可以从队尾弹出。

我们准备一个Boolean型的flag,一开始为true,每次为true就弹出队首元素,然后置为false,每次为false就弹出队尾元素,然后置为true,如此交替即可实现交替弹出队首队尾。

alt

import java.util.ArrayDeque;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        ArrayDeque deque = new ArrayDeque();

        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String name = scanner.next();
            // 初始化队列中的数据
            deque.offerLast(name);
        }
        Boolean flag = true; //表示奇偶,奇偶出队分别是首尾
        while(!deque.isEmpty()){ //队列没有人为止
            if(flag){ //弹队首
                System.out.println(deque.getFirst());
                deque.removeFirst();
                flag = false; //交替
            }else{ //弹队尾
                System.out.println(deque.getLast());
                deque.removeLast();
                flag = true; //交替
            } 
        }
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为队列长度,每个元素都会被弹出来
  • 空间复杂度:O(n)O(n),队列长度为nn