首页 > 编程语言 >java中的栈和队列

java中的栈和队列

时间:2023-02-24 22:55:18浏览次数:36  
标签:Deque java 容量 队列 元素 方法

一、队列的简单介绍

队列是一种遵循先进先出原则的数据结构,一般会有一个对头和一个对尾,只能在对头取出元素,在队尾添加元素。

在上边的图中元素4最先进入队列,所以元素4最先从队头取出

二、java中的队列接口

2.1 Queue

java中给出了一个接口java.util.Queue 来定义了队列基本的操作方法,这些方法根据功能可以分为3类,插入,取出,查看

其中add和offer都是往队尾添加元素的方法,区别是当队列容量已满不能添加新元素时

add方法会抛出IllegalStateException

offer方法不抛出异常会返回false。

remove和poll都是从队头移出(取出)元素的方法,区别是当队列中没有元素时remove会抛出异常NoSuchElementException ,poll会返回null

element和peek都是返回队列头部的元素但不把它从队列中删除,这是和remove方法的区别,同样的它们俩当队列中没有元素时一个会抛出异常,一个会返回false。

2.2 Deque

java.util.Deque 这是java中定义的一个双向队列接口,双向的意思就是在这个队列的两端都可以进行插入和取出元素的操作。

这些方法被分为了操作头和操作尾两大类,同时也可以按抛异常/返回特殊值分为两大类。

当然双向队列是可以被当做单向队列使用的,只需要按队尾进对头出的原则调用方法就行,因为DequeQueue 的子类,所以队列接口中的方法它都有,方法间是有对应关系的。

当把Deque当做单向队列来使用时更推荐使用右边的方法来完成操作。

当然对于双向队列,你只要从一端添加,从另一端移出,它就是被当做单向队列在使用,既可以尾进头出,也可以头进尾出,这个时候都是单向队列

三、java中队列的常见实现类

ArrayDeque,这是一个基于数组的双向队列实现,这个队列没有容量限制,放置元素时会自动扩容(容量*2),所以可以说是一个无界队列,但实际上一个容器的容量不可能无限大,否则会撑爆内存,所以扩容方法doubleCapacity

中做了限制,因为源码中容量*2是通过把原来的容量左移一位来实现加倍的,所以当这个数字特别大,左移后超出int的上限就会变成负数,这个状态就是容量上限。

private void doubleCapacity() {
        assert head == tail;
        int p = head;
        int n = elements.length;
        int r = n - p; // number of elements to the right of p
        int newCapacity = n << 1;
        if (newCapacity < 0)
            throw new IllegalStateException("Sorry, deque too big");//超出容量上限了
        Object[] a = new Object[newCapacity];
        System.arraycopy(elements, p, a, 0, r);
        System.arraycopy(elements, 0, a, r, p);
        elements = a;
        head = 0;
        tail = n;
}

LinkedList 是一个基于链表的双向队列实现,当然它同时也是List接口的实现。它也是一个无界队列,因为是基于链表实现的,所以容量理论上是无限的,但实际当然受限于内存的大小。

LinkedBlockingQueue 基于链表实现, 这虽然是一个阻塞队列,但也可以被当做普通队列使用,它是一个有界队列,当创建时不指定容量,则默认的容量是Integer.MAX_VALUE

ArrayBlockingQueue 基于数组实现 这虽然是一个阻塞队列,但也可以被当做普通队列使用,它是一个有界队列,创建时必须指定容量.

四、java中的栈

栈是一种遵循先入后出的数据结构,先进入的元素被压到栈底最后才能弹出。

java提供了一个Stack 类来描述栈,但实际上双向队列Deuque 就可以被当做栈使用,只需要按先入后出的元素调用方法

push是入栈(压入栈底),pop是出栈(返回栈顶并移出),peek是返回栈顶(不移除)的元素,都可以用Deque的方法代替。

标签:Deque,java,容量,队列,元素,方法
From: https://www.cnblogs.com/chengxuxiaoyuan/p/17153460.html

相关文章

  • Java的安装开发环境
    Java的安装开发环境卸载JDK删除Java的安装目录删除JAVA_HOME删除path下关于Java的目录查看Java-version安装JDK搜索JDK11,找到下载地址同意协议......
  • JAVAWEB-NOTE02-SQL
    目录SQL简介SQL通用语法SQL分类DDL操作数据库操作表navicat连接本地数据库DMLDQL基础查询条件查询分组查询聚合函数分组查询排序查询分页查询SQL简介●英文:Structured......
  • Java面向对象进阶第一天
    面向对象高级第一天static关键字是静态的意思,可以修饰成员变量,也可以修饰成员方法成员变量的分类静态成员变量有static修饰,属于类,与类一起加载,内存中只有一份,可以......
  • SpringBoot26 - 消息队列 MQ
    消息消息的概念​ 从广义角度来说,消息其实就是信息,但是和信息又有所不同。信息通常被定义为一组数据,而消息除了具有数据的特征之外,还有消息的来源与接收的概念。通常发......
  • java技能项目简历--参考
    1、熟悉常用Java开源框架Spring、SpringMVC、Mybatis等,了解SpringBoot、SpringCloud更佳;2、熟悉Html、Css、JavaScript、jQuery等前端开发技术;3、了解Dubbo、Zookeeper、Na......
  • Java基础
    多态?假设我们有一个Animal类,其中包含一个makeSound()方法。现在我们可以创建多个子类,如Dog和Cat,它们可以继承Animal类并覆盖makeSound()方法,以产生不同的声音。publicc......
  • java 中清理所有特殊字符
    publicstaticStringfilter(Stringstr)throwsPatternSyntaxException{//清除掉所有特殊字符StringregEx="[`_《》!@#$%^&*()+=|{}':;',\[\].<>?!@#¥%……&*()——+......
  • Java学习之异常
    异常exception一般需要程序员管理的异常可以分为两类:Exception(大类):Runnable异常及其子类其他异常运行时异常:RuntimeException及其子类,编译时不会出现异常,运行......
  • 【JavaScript】27_浅拷贝和深拷贝 + 对象的复制
    7、浅拷贝和深拷贝浅拷贝(shallowcopy)通常对对象的拷贝都是浅拷贝浅拷贝顾名思义,只对对象的浅层进行复制(只复制一层)如果对象中存储的数据是原始值,那么拷贝的深浅是不重要浅......
  • 【JavaScript】28_数组的常用方法
    9、数组的方法push()向数组的末尾添加一个或多个元素,并返回新的长度pop()删除并返回数组的最后一个元素unshift()向数组的开头添加一个或多个元素,并返回新的长度shift()删......