返回顶部
首页 > 资讯 > 精选 >Java栈和队列怎么应用
  • 600
分享到

Java栈和队列怎么应用

2023-07-02 12:07:45 600人浏览 泡泡鱼
摘要

这篇“Java栈和队列怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java栈和队列怎么应用”文章吧。在学习栈和队列

这篇“Java栈和队列怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java栈和队列怎么应用”文章吧。

Java栈和队列怎么应用

学习栈和队列 之前,先了解一下什么是线性表:一次保存单个同类型的元素,多个元素之间逻辑上连续,比如数组链表字符串,栈和队列
栈和队列其实操作受限的线性表,数组也罢,链表也罢,既可以在头部插入和删除,也能在尾部插入和删除,但是栈和队列只能在一端插入,在一端删除

一、栈

1.定义

只能在一端插入元素,也只能在这一端删除元素(栈顶),可以把栈看作一个“水杯”,只能从一端添加元素,也只能从一段删除元素,而且,先进入水杯的水在杯底,后进入水杯的水在杯顶,往出倒水的时候,也是倒出的杯顶的水,栈也是一样,先入栈的元素在栈底,后入栈的元素在栈顶,所以先入栈的元素后出,后入栈的元素先出,这也是栈的特性“先进后出,后进先出”Last In First Out(LIFO),取出元素和添加元素只能在栈顶。
将1 2 3 4 5,一次放入栈中
Java栈和队列怎么应用

2.栈的应用

1.无处不在的undo(撤销)操作

在任何一个编辑器中输错一个内容后,使用Ctrl + z就返回到了输入的内容;
在任何一个浏览器中点击后退操作
Java栈和队列怎么应用
都是栈的这个结构的应用
1.使用编辑器使用撤销操作,一次输入就把内容压入栈中,再输入就就再压入栈中,发现一次输入错误,就使用撤销操作,把当前栈顶的错误内容弹出,那么当前栈顶的内容就是上次输入的内容。
2.浏览网页其实也是相同原理的,就像打开百度 -> 打开csdn -> 打开创作中心,也是使用栈这个结构,先把百度网页压入栈中 ,然后csdn网页压入栈中,然后创作中心网页压入栈中,想要返回到csdn主页,按下后头箭头,就把当前栈顶的创作中心网页弹出,取出csdn主页。

2.操作系统

程序再执行的过程中,从A函数调用B函数,从B函数调用C函数,调用结束,返回执行时,如何得知从哪继续开始执行呢,背后也是栈这个结构

3.栈的实现

基于链表实现的栈 – 链式栈
基于数组实现的栈 – 顺序栈(使用较多)
定义一个基于动态数组实现的栈

//基于动态数组实现的顺序栈public class MyStack<E> {    //记录当前栈的元素个数    private int size;    //实际存储数据的动态数组,此时在栈中只能在数组的尾部添加和删除元素    private List<E> data = new ArrayList<>();    }

4.栈的操作

向栈中添加一个元素
只能在栈顶添加

     public void push(E val){        data.add(val);        size++;    }

当前从栈顶弹出一个元素

    public E pop(){        if (isEmpty()){            //栈为空无法弹出            throw new NoSuchElementException("stack is empty!cannot pop!");        }        //在数组末尾删除元素        E val = data.get(size - 1);        data.remove(size - 1);        size --;        return val;    }

查看当前栈顶元素,但不弹出

    public E peek(){        if (isEmpty()){            throw new NoSuchElementException("stack is empty!cannot peek!");        }        return data.get(size - 1);    }

二、队列

1.定义

队列:先进先出(FIFO)的数据结构i,元素只能从队尾添加到队列中,也只能从队首出队列,元素的出队顺序和入队顺序保持一致
将1 2 3 4 5依次入队
Java栈和队列怎么应用

2.队列的应用

现实生活中,各种各样的“排队”操作

3.队列的实现

基于数组实现的队列 – 顺序队列
基于链表实现的队列 – 链式队列
出队操作只能在队列的头部进行,若采用数组实现的队列,每次出队一个元素就得搬移剩下的所有元素向前移动一个单位,此时采用链表实现的队列更适合队列的结构,删除元素只需要删除头结点,添加元素在链表的尾部添加

public interface Queue<E> {    //入队操作    void offer(E val);    //出队操作    E poll();    //查看队首元素    E peek();    boolean isEmpty();}

对于栈来说队列的实现子类是比较多的,比如
FIFO队列
双端队列
循环队列
优先级队列
不管哪个队列都要实现

4.FIFO队列

定义一个FIFO队列

// An highlighted blockvar foo = 'bar';

向队列中添加一个元素

public void offer(E val) {        node<E> node = new Node<>(val);        if (head == null){            head = tail = node;        }else{            //链表的尾插            tail.next = node;            tail = node;        }        size++;    }

从当前队首出队一个元素

 public E poll() {        if (isEmpty()){            throw new NoSuchElementException("queue is empty! cannot poll!");        }        //头删        E val = head.val;        Node<E> node = head;        head = head.next;        node.next = node = null;        size--;        return val;    }

查看当前队列的队首元素

public E peek() {        if (isEmpty()){            throw new NoSuchElementException("queue is empty!cannot peek!");        }        return head.val;    }

5.循环队列

定义:基本上都是使用固定长度的数组来实现,数组在实现队时,若从数组头部删除元素需要频繁的移动后面的元素,效率比较低;出队和入队操作,使用两个引用,一个head,一个tail,添加元素在数组的尾部添加,删除元素只需要移动head引用指向的地址即可(逻辑删除)
2.应用:操作系统的生产消费者模型,MySQL数据库的InnoDB存储引擎的redo日志
3.循环队列就是使用长度固定的数组来实现,数组头部就是队首(head),数组的尾部就是队尾(tail),数组[head…tail)时循环队列的有效元素
head永远指向循环队列的第一个元素
tai永远指向循环队列有效元素的后一个位置
Java栈和队列怎么应用
此时循环队列的有效元素就为7 9 1两个元素
循环队列出队一个元素,就只用让head引用向后移动一个位置
Java栈和队列怎么应用
此时循环队列的有效元素就只有9 和 1 两个元素了
再出队一个元素,但此时head引用已经走到末尾了,所谓循环队列就是当head或者tail引用走到数组末尾时,再向后移动就是返回数组头部的操作,循环队列最大好处就是进行元素的删除的时候不需要进行数据的搬移操作,当有新的元素添加到队列中就会覆盖掉原来的元素,就只需要将tail索引位置覆盖上新的元素,再让tail再向后移动

当队列为空时,head == tail

Java栈和队列怎么应用

当队列已“满”时,head == tail

Java栈和队列怎么应用
循环队列需要注意的关键点
1.因此当head 和 tail相等时,没法区分此时循环队列已满,还是为空,因此在循环队列中,若(tail + 1) % n == head就认为循环队列已满
Java栈和队列怎么应用
此时循环队列就已经满了,在循环队列中就会浪费一个空间,判断队列是否已满
2.head和tail的移动不能简单的 + 1,使用取模操作,取数组长度
tail = (tail + 1) % n
head = (head + 1) % n
对数组长度取模的本质:
当head和tai走到数组最后一个索引位置时,下一次要返回数组头部,就必须用 + 1对数组长度取模
3.head == tail时,认为队列为空

6.循环队列的操作

定义一个循环队列

//基于整形的循环队列public class LoopQueue implements Queue<Integer> {    //定长数组    private Integer[] data;    //指向队首元素    int head;    //指向队尾元素的下一个元素    int tail;    public LoopQueue(int size){        data = new Integer[size + 1];    }}

向循环队列中添加一个元素

@Override    public void offer(Integer val) {       if (isFull()){           throw new ArrayIndexOutOfBoundsException("loopQueue is full!cannot offer");       }       data[tail] = val;       tail = (tail + 1) % data.length;    }

从循环队列中出队一个元素

 @Override    public Integer poll() {        if (isEmpty()){            throw new NoSuchElementException("loopQueue is empty!cannot poll!");        }        Integer val = data[head];        head = (head + 1) % data.length;        return val;    }

查看当前循环队列队首元素

 @Override    public Integer peek() {        if (isEmpty()){            throw new NoSuchElementException("loopQueue is empty!cannot peek!");        }        return data[head];    }

判断当前循环队列是否为空

 @Override    public boolean isEmpty() {        return head == tail;    }

判断当前循环队列是否已满

 public boolean isFull(){        return (tail + 1) % data.length == head;    }

toString方法

public String toString(){        StringBuilder sb = new StringBuilder();        sb.append("front [");        //最后一个有效元素的索引        int lsatIndex = tail == 0 ? data.length - 1 : tail - 1;        for (int i = head; i != tail;) {            sb.append(data[i]);            if (i != lsatIndex){                sb.append(", ");            }            i = (i + 1) % data.length;        }        sb.append("] tail");        return sb.toString();    }

7.双端队列

双端队列:Deque是Queue的子接口,这个队列既可以尾插,头出;也可以头插,尾出
Java栈和队列怎么应用
双端队列的一个常用子类就是LinkedList,不管使用栈还是队列,都可以统一使用双端队列接口
1.现在需要一个栈
Java栈和队列怎么应用
2.现在需要一个队列
Java栈和队列怎么应用

以上就是关于“Java栈和队列怎么应用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Java栈和队列怎么应用

本文链接: https://lsjlt.com/news/341914.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java栈和队列怎么应用
    这篇“Java栈和队列怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java栈和队列怎么应用”文章吧。在学习栈和队列...
    99+
    2023-07-02
  • 栈和队列-Java
    目录 一、栈      1.1 概念      1.2 栈的使用      1.3 栈的模拟实现       1.4 栈的应用场景     1.5 概念区分 二、队列     2.1 概念     2.2 队列的使用     2.3 队列的...
    99+
    2023-09-27
    面试 职场和发展 java 数据结构 算法
  • Java中怎么实现栈和队列
    这期内容当中小编将会给大家带来有关Java中怎么实现栈和队列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。栈的创建:我们接下来通过链表的形式来创建栈,方便扩充。代码实现:public class Stac...
    99+
    2023-06-17
  • JavaScript中栈和队列应用详情
    目录什么是栈和队列什么时候用到栈目录的计算什么是栈和队列 栈如果用数组模拟的话是类似于一个U形桶状堆栈空间,地下是封口的,只能从顶部一个地方进出,它的进出都是有顺序的,看下图:如果是...
    99+
    2024-04-02
  • 如何写Java栈和队列
    本文小编为大家详细介绍“如何写Java栈和队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何写Java栈和队列”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们知道,在数组中,若知道数据项的下标,便可立即访...
    99+
    2023-06-02
  • java 队列和栈区别是什么
    队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。区别如下:一、规则不同 队列:先进先出(First In First Out)FIFO 栈:先...
    99+
    2014-07-12
    java入门 java 队列 区别
  • Java栈与队列怎么实现
    本篇内容主要讲解“Java栈与队列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java栈与队列怎么实现”吧!1、实现循环队列【OJ链接】循环队列一般通过数组实现。我们需要解决几个问题。...
    99+
    2023-06-29
  • java中栈和队列的区别
    栈:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 (推荐学习:java课程)栈(Stack)是操作系统在建立某个进程时或者线程(在...
    99+
    2020-09-10
    java入门 java
  • Python栈和队列怎么实现
    这篇文章主要介绍“Python栈和队列怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python栈和队列怎么实现”文章能帮助大家解决问题。一、栈概述栈(st...
    99+
    2024-04-02
  • C++栈和队列怎么实现
    本篇内容主要讲解“C++栈和队列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++栈和队列怎么实现”吧!栈的定义和实现#ifndef Stack_H  #...
    99+
    2023-06-17
  • Java中栈和队列有什么区别
    这期内容当中小编将会给大家带来有关Java中栈和队列有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面...
    99+
    2023-06-14
  • Java怎么使用跳转结构实现队列和栈
    本篇内容介绍了“Java怎么使用跳转结构实现队列和栈”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!队列跳转结构结点public s...
    99+
    2023-07-06
  • Java的栈和队列实例分析
    这篇文章主要讲解了“Java的栈和队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的栈和队列实例分析”吧!栈package com.yuzhenc.collect...
    99+
    2023-06-29
  • java中栈和队列的区别是什么?
    队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。区别如下:一、规则不同队列:先进先出(First In First Out)FIFO栈:先进后...
    99+
    2021-02-23
    java教程 java 队列
  • 一起来学习Java的栈和队列
    目录栈队列阻塞队列双端队列总结栈 package com.yuzhenc.collection; import java.util.Stack; public class Te...
    99+
    2024-04-02
  • C语言怎么实现栈和队列
    本文小编为大家详细介绍“C语言怎么实现栈和队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现栈和队列”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是栈栈:一种特殊的线性表,其只允许在固定的一端...
    99+
    2023-06-30
  • Python中怎么用队列实现栈
    这篇文章给大家介绍Python中怎么用队列实现栈,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。题目:使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素e...
    99+
    2023-06-02
  • Java数据结构学习之栈和队列
    目录一、栈1.1 概述1.1.1 线性表的概念1.1.2 栈的概念1.1.3 栈的应用二、队列2.1 队列的概念2.2 队列的实现2.3 队列的应用一、栈 1.1 概述 Java为什...
    99+
    2024-04-02
  • Java栈和队列的相互转换详解
    目录用栈实现队列—力扣232题用队列实现栈—力扣225题 1. 双队列实现栈2.一个队列实现栈栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。...
    99+
    2024-04-02
  • Java栈和基础队列的实现详解
    目录栈(stack)栈支持的三个核心操作:栈的常见实际应用:栈的实现队列无论是哪种队列,都必须支持三个核心操作:基础队列的实现 栈和队列:都是线性表,都是基于List基础上...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作