Java双端队列是一种特殊的数据结构,它允许在两端进行插入和删除操作。它的特点是可以从两端进行插入和删除,而不仅仅是从一端。因此,它也被称为双向队列。
Java双端队列的实现方式有很多,最常用的是使用数组或者链表来实现。使用数组来实现时,只需要一个数组和两个游标即可:一个游标用于标识头部位置;另一个游标用于标识尾部位置。当头部位置小于尾部位置时,表明队列中有元素存在。
public class Deque { private int[] array; // 数组存储元素 private int head; // 头部位置 private int tail; // 尾部位置 public Deque(int capacity) { // 构造函数 array = new int[capacity]; head = 0; tail = 0; } public void addFirst(int element) { // 在头部添加元素 if (head == 0) { // 如果头部已满(即head=0时),不能再往前加元素了 throw new RuntimeException("Deque is full"); } else { // 否则将新元素加在head-1的位子上,并将head减1. array[--head] = element; } } public void addLast(int element) { // 在尾部添加元素 if (tail == array.length) { // 如果尾部已满,不能再往后加元 素了 throw new RuntimeException("Deque is full"); } else {// 否则将新元 素加在tail上,并将tail加1. array[tail++] = element; } } public int removeFirst() {// 移除头部的元 素 if (head == tail) {// 如 果头尾相同,证明此时没有元 素存在,不能再往前出了. throw new RuntimeException("Deque is empty"); } else {// 否则将head上的值保存起来,并将head加1. return array[head++]; } } public int removeLast() {// 移 除尾部的元 素 if (head == tail) {// 如 果头尾相同,证明此时没有元 素存在,不能再往后出了. throw new RuntimeException("Deque is empty"); } else {// 否则将tail-1上的值保存起来,并将tail减1. return array[--tail]; }}
双端队列或deque扩展队列以允许元件从两端插入和移除。
Deque
类的实例表示双端队列。 Deque
接口扩展了 Queue
接口。
它声明了方便所有操作的其他方法对于头部以及尾部的队列。它可以用作FIFO队列或LIFO队列。
ArrayDeque和LinkedList类是Deque接口的两个实现类。
ArrayDeque
类由数组支持,而 LinkedList
类由链表支持。
如果您使用Deque作为堆栈,则应该使用 ArrayDeque
作为 Deque
实现。
如果使用 Deque
作为FIFO队列, LinkedList
以下代码显示如何使用 Deque
作为FIFO队列。
import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addLast("Oracle"); deque.offerLast("Java"); deque.offerLast("CSS"); deque.offerLast("XML"); System.out.println("Deque: " + deque); // remove elements from the Deque until it is empty while (deque.peekFirst() != null) { System.out.println("Head Element: " + deque.peekFirst()); deque.removeFirst(); System.out.println("Removed one element from Deque"); System.out.println("Deque: " + deque); } // the Deque is empty. Try to call its peekFirst(), // getFirst(), pollFirst() and removeFirst() methods System.out.println("deque.isEmpty(): " + deque.isEmpty()); System.out.println("deque.peekFirst(): " + deque.peekFirst()); System.out.println("deque.pollFirst(): " + deque.pollFirst()); String str = deque.getFirst(); System.out.println("deque.getFirst(): " + str); str = deque.removeFirst(); System.out.println("deque.removeFirst(): " + str); } }
上面的代码生成以下结果。
以下代码显示如何使用Deque作为堆栈(或LIFO队列)。
import java.util.ArrayDeque; import java.util.Deque; public class Main { public static void main(String[] args) { // Create a Deque and use it as stack Deque<String> deque = new ArrayDeque<>(); deque.push("Oracle"); deque.push("HTML"); deque.push("CSS"); deque.push("XML"); System.out.println("Stack: " + deque); // remove all elements from the Deque while (deque.peek() != null) { System.out.println("Element at top: " + deque.peek()); System.out.println("Popped: " + deque.pop()); System.out.println("Stack: " + deque); } System.out.println("Stack is empty: " + deque.isEmpty()); } }
上面的代码生成以下结果。
JSF教程 -JSF所有消息标记h:messages标记在与UI元素对应的一个地方显示所有消息。以下JSF标记h:messages style=color:red;margin...
JSF教程 -JSF表单文本域示例h:inputText标签渲染类型为“text的HTML输入元素。下面的JSF代码h:inputTextarea row=10 col=10 valu...
JSF教程 -JSF自定义转换器示例我们可以在JSF中创建我们自己的自定义转换器。以下列表是我们可以按照在JSF中创建自定义转换器的步...
Java教程 -Java抽象类抽象类是抽象的想法或概念。例如,int数据类型是一个具体的数据类型,double是另一个数据类型具体数据类型...