举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > java双端队列的实现 Java 双端队列

java双端队列的实现 Java 双端队列

2023-05-23 04:18 Java教程

java双端队列的实现 Java 双端队列

java双端队列的实现

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

Java 双端队列

Java集合教程 - Java双端队列


双端队列或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());
  }
}

上面的代码生成以下结果。



阅读全文
以上是编程学为你收集整理的java双端队列的实现 Java 双端队列全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部