JAVA 中栈,为什么要使用Deque,而不推荐使用Stack

双端队列(Deque)

一、概念

1. 概念
    双端队列(Deque)是Quene是一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队(push)和出队(pop),则可限制栈的数据结构。对于栈而言,有入栈,遵循先进后出原则。

2. 双端队列的使用
   (在实际使用中,Deque接口使用的是比较多的,栈和队列都可以使用该接口,这个接口中有栈的方法,也有队列的方法)

Queue以及Deque都是继承于Collection,Deque是Queue的子接口。

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack_第1张图片

 Queue是先进先出的单向队列,Deque是双向队列。

public interface Deque extends Queue 

二、Queue接口
1、Queue是集合框架Collection的子接口,是一种常见的数据结构,Queue有一个直接子类PriorityQueue,队列Quene是一种常用的数据结构,可以将队列看作是一种特殊的线性表,该结构遵循的先进先出原则。Java中,LinkedList实现了Queue接口,因为LinkedList进行插入、删除操作效率较高。

poll():将队首的元素删除,并返回该元素。
peek():返回队首的元素,但不进行删除操作。
offer():将元素添加到队尾,如果成功,则返回true。

2、 Queue的具体代码操作


import java.util.*;

public class QueueDemo {
    public static void testQuene(){
        Queue qu = new LinkedList<>();
        qu.add("小米");
        qu.add("华为");

        System.out.println("原始队列:");
        System.out.println(qu);

        System.out.println("通过add往队尾添加元素:");
        qu.add("OPPO"); //add()方法
        System.out.println(qu);
        System.out.println("通过offer往队列尾添加元素:");
        qu.offer("vivo"); //offer()方法
        System.out.println(qu);

        System.out.println("使用remove删除队列头元素:");
        qu.remove(); //remove()方法
        System.out.println(qu);
        System.out.println("使用poll删除对列头元素:");
        qu.poll(); //poll()方法
        System.out.println(qu);
    }
    public static void main(String[] args){
        QueueDemo.testQuene();
    }
}

执行结果如下:
原始队列:
[小米, 华为]
通过add往队尾添加元素:
[小米 , 华为, OPPO]
通过offer往队列尾添加元素:
[小米, 华为, OPPO, vivo]
使用remove删除队列头元素:
[小米, OPPO, vivo]
使用poll删除对列头元素:
[OPPO, vivo]

三、Deque接口(双向队列)
1、双端队列(Deque),是Queue是一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队(push)和出队(pop),则可限制栈的数据结构。对于栈而言,有入栈,遵循先进后出原则。
  它既可以当作栈使用,也可以当作队列使用

add()\offer(e):将元素增加到队列的末尾,如果成功,返回true。
remove()\poll():将元素从队列的队首删除。
element()\peek():返回队首的元素,但不进行删除
栈:
push(e):入栈,添加到队首
pop(e):出栈,删除队首元素
peek():返回栈首元素,但不进行删除

ArrayDeque, LinkedList , Stack的关系差不多就是下图那样

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack_第2张图片

 Stack实现了Vector接口,LinkKist实现了Deque,List接口,ArrayDeque实现了Deque接口

为什么不推荐使用Stack?
因为Vector是当初JAVA曾经写得不太行的类,所以Stack也不太行。

Vector不行是因为效率不太行,很多方法都用了synchronized修饰,虽然线程安全,但是像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Collections.synchronizedCollection()转化成线程安全的,所以Vector就没什么用处了
Stack只能上进上出,
Deque上进上出,上进下出,甚至下进上出,非常上流,只有你想不到,没有我Deque做不到的。

ArrayDeque与LinkList区别:
ArrayDeque:
  • 数组结构
  • 插入元素不能为null
  • 无法确定数据量时,后期扩容会影响效率
LinkList:
  • 链表结构
  • 插入元素能为null
  • 无法确定数据量时,有更好表现

Deque中常用方法:

以这2个为基础整出来的Deque除了结构不一样,方法都一样的。

把Deque当栈用的时候:

 把Deque当队列用的时候:

 有些时候需要进行一些骚操作的时候(比如取得栈底元素,取得队尾元素),这些常规操作就不能满足了。

  • 下面就是Deque中一些更详细的方法。

从上面(头部)插入:

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack_第3张图片

从上面(头部)出来/观察:

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack_第4张图片

从下面(尾部)插入:

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack_第5张图片

从下面(尾部)出来/观察:

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack_第6张图片

相关参考链接:              
[1]原文链接:https://blog.csdn.net/weixin_42488513/article/details/120233456           
[2]原文链接:https://blog.csdn.net/qq_44013629/article/details/106461200

你可能感兴趣的:(java,开发语言)