iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Java中栈和队列有什么区别
  • 371
分享到

Java中栈和队列有什么区别

2023-06-14 23:06:38 371人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关Java中栈和队列有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面

这期内容当中小编将会给大家带来有关Java中栈和队列有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Java的特点有哪些

Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。2.Java具有简单性、面向对象、分布式安全性、平台独立与可移植性、动态性等特点。3.使用Java可以编写桌面应用程序、WEB应用程序、分布式系统和嵌入式系统应用程序等。

一、栈

1.1 概述

Java为什么要有集合类: 临时存储数据。
链表的本质: 对象间通过持有和引用关系互相关联起来。

线性表: 普通线性表, 操作受限线性表(某些操作受到限制 --> 某一个线性表它的增删改操作受到限制) --> 栈 & 队列

1.1.1 线性表的概念

(1)线性表:n个数据元素的有序序列。

①首先,线性表中元素的个数是有限的。
②其次,线性表中元素是有序的。

(2)那这个”序”指的是什么呢?

①除表头和表尾元素外,其它元素都有唯一前驱和唯一后继,其唯一前驱或唯一后继确定了该元素在线性表中的位置。
②因此,线性表中,每个数据元素都有一个确定的位序,这个确定的位序我们称之为索引。 表头元素有唯一后继,无前驱,表尾元素有唯一前驱,无后继。

1.1.2 栈的概念

栈是一种”操作受限”的线性表,体现在只能在一端插入和删除数据,符合FILO的特性。

FILO: 先进后出,
LIFO: 后进先出

1.1.3 栈的应用

Java中栈和队列有什么区别

线性表和哈希表在以后工作中会最常用。
栈在实际工作中不常用

应用场景:

函数调用栈
2.反序字符串: 实现reNumber(str)方法,反转字符串(附代码) 。

public class DemoStack1 {    public static void main(String[] args) {        String str = "123456789";        String reStr = reStr(str);        System.out.println(reStr);    }    // 栈先进后出    public static String reStr(String str){        MyArrayStack<Character> stack = new MyArrayStack<>();        for (int i = 0; i < str.length(); i++) {            stack.push(str.charAt(i));        }        StringBuffer buffer = new StringBuffer();        // 1 2 3 4 5 6 7 8 9        while (!stack.isEmpty()){            Character pop = stack.pop();            buffer.append(pop);        }        return buffer.toString();    }}

括号匹配问题: 实现judgeBracket(str)方法来判断括号匹配 (附代码)。

public class DemoStack2 {    public static void main(String[] args) {        String str = "public class) DemoStack2 {public static void main(String[] args) {}}";        boolean bool = judgeBracket(str);        System.out.println(bool);    }    public static  boolean judgeBracket(String str){        MyArrayStack<Character> stack = new MyArrayStack<>();        for (int i = 0; i < str.length(); i++) {            char c = str.charAt(i);            // 判断c 是left括号, 然后入栈            if (c == '{'){                stack.push('}');            } else if (c == '['){                stack.push(']');            }else if (c == '('){                stack.push(')');            } else if (c == '}' || c == ')' || c == ']'){                Character pop = stack.pop();                if (c != pop){// 不匹配                    return false;                }            }        }        return stack.isEmpty();    }}

编译器利用栈实现表达式求值

浏览器的前进后退功能

利用栈实现 DFS: depth-first-search 深度优先遍历(树 图)

编译器利用栈实现表达式求值

中缀表达式: 2 + 3 * 2 给人看的 , 运算符放到中间
前缀表达式: + 2 * 3 2 运算符放到之前
后缀表达式: 2 3 2 * + 运算符放到后面

// 中缀表达式转化为后缀:
// 遍历中缀表达式
// 遇到操作数输出
// 遇到操作符, 出栈, 直到遇到更低优先级的操作符, 操作符入栈
// 遍历完成, 全部弹栈

// 中缀表达式转化为前缀:
// 遍历中缀表达式: 逆序遍历
// 遇到操作数输出: 头插法
// 遇到操作符, 出栈, 只弹出更高优先级的操作符, 操作符入栈
// 遍历完成, 全部弹栈

二、队列

2.1 队列的概念

队列也是一种”操作受限”的线性表,体现在一端插入数据在另一端删除数据,特性是FIFO。

Java中栈和队列有什么区别

2.2 队列的实现

实现一个集合类
集合类: 数据容器
底层: 数组 or 链表
数据结构表现: 队列

(1)用数组实现一个队列。

public class MyArrayQueue <T> {    private final int MAX_CAPACITY = Integer.MAX_VALUE - 8;    private final int INIT_CAPACITY = 16;    private Object[] objs;    private int size;    private int head;// 头的下标    private int end;// 尾的下标    public MyArrayQueue(){        objs = new Object[INIT_CAPACITY];    }    public MyArrayQueue(int initCapcity){        if (initCapcity <= 0 || initCapcity > MAX_CAPACITY) throw new IllegalArgumentException("" + initCapcity);        objs = new Object[initCapcity];    }    public boolean offer(T t){        // 如果数组满了        if (size == objs.length){            int newLen = getLen();            grow(newLen);        }        // 可以添加        if (isEmpty()){            // 没有任何元素存储: 新添加的元素就是唯一的元素            objs[head] = t;            end = head;            size++;            return true;        } else {            // 原本存储就有内容            // 尾后移一位            end = (end + 1) % objs.length;            objs[end] = t;            size++;            return true;        }    }    private void grow(int newLen) {        Object[] newArr = new Object[newLen];        for (int i = 0; i < objs.length; i++) {            int index = (head + i) % objs.length;            newArr[i] = objs[index];        }        objs = newArr;        head = 0;        end = size - 1;    }    private int getLen() {        int oldLen = objs.length;        int newLen = oldLen << 1;        // 判断新长度是否溢出        if (newLen <= 0 || newLen > MAX_CAPACITY){            newLen = MAX_CAPACITY;        }        // 如果新长度和旧长度一样        if (newLen == oldLen)throw  new RuntimeException("stack can not add");        return newLen;    }    public T poll(){        if (isEmpty()) throw new RuntimeException("queue is empty");        if (size == 1){            // 原队列中只剩一个元素            T oldValue = (T)objs[head];            head = 0;            end = 0;            size--;            return oldValue;        } else {            // 队列中超过一个元素            T oldValue = (T)objs[head];            head = (head + 1) % objs.length;            size--;            return oldValue;        }    }    public T peek(){        if (isEmpty()) throw new RuntimeException("queue is empty");        return (T)objs[head];    }    public int size() {        return size;    }    public boolean isEmpty(){        return size == 0;    }}

(2)用链表实现一个链表。

public class MyLinkedQueue <T> {    private node head;// 队头    private Node end; // 队尾    private int size;    // 添加 offer    // 删除 poll    // 查看队头元素 peek    public  boolean offer(T t){        // 如果原队列为空        if (isEmpty()){// 原队列空            // 让头尾都指向这个新加的结点            head = new Node(t, null);            end = head;            size++;            return true;        }        // 原队列不空        // 把这个元素添加到队尾        end.next = new Node(t, null);        end = end.next;// end后移        size++;        return true;    }    public T poll(){        if (isEmpty()) throw  new RuntimeException("queue is empty");        if (size == 1){            // 代表着, 链表中只有一个元素            T oldVlaue = head.value;            head = null;            end = null;            size--;            return  oldVlaue;        }else {            T oldVlaue = head.value;            head = head.next;            size--;            return oldVlaue;        }    }    public T peek(){        if (isEmpty()) throw  new RuntimeException("queue is empty");        return head.value;    }    public boolean isEmpty(){        return size == 0;    }    public int size(){        return size;    }    class Node{        T value;        Node next;        public Node(T value, Node next) {            this.value = value;            this.next = next;        }    }}

2.3 队列的应用

(1)队列更不常用(自己写代码使用不常用):

(2)常见, 很多jdk源码, 中间件的源码上 很多地方使用了队列

Eg:

①生产者消费者问题

生产者 – 消费者
生产者: 厨师
消费者: 吃面包的人
桌子: 放面包的地方

线程池

线程池: 任务
生产者: 产生任务
消费者: 线程
桌子: 队列

③生态环境:

第三方轮子: 要看懂
Maven

消息队列缓存

(3)普通队列的应用场景是很有限的,一般在工程中用到的是阻塞队列。

①阻塞队列(有一个队列, 大小一定):常用于生产者-消费者模型中。
当队列满的时候,入队列就阻塞。
当队列空的时候,出队列就阻塞。

②利用队列实现 BFS:breadth first search 广度优先搜索/ 遍历 ()

上述就是小编为大家分享的Java中栈和队列有什么区别了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java中栈和队列有什么区别

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中栈和队列有什么区别
    这期内容当中小编将会给大家带来有关Java中栈和队列有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面...
    99+
    2023-06-14
  • 栈和队列-Java
    目录 一、栈      1.1 概念      1.2 栈的使用      1.3 栈的模拟实现       1.4 栈的应用场景     1.5 概念区分 二、队列     2.1 概念     2.2 队列的使用     2.3 队列的...
    99+
    2023-09-27
    面试 职场和发展 java 数据结构 算法
  • java堆和栈有什么区别
    Java中的堆(Heap)和栈(Stack)是两种不同的内存区域,主要用于存储对象和方法的局部变量。 分配方式:堆内存是由Jav...
    99+
    2023-10-28
    java
  • Java中怎么实现栈和队列
    这期内容当中小编将会给大家带来有关Java中怎么实现栈和队列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。栈的创建:我们接下来通过链表的形式来创建栈,方便扩充。代码实现:public class Stac...
    99+
    2023-06-17
  • 堆和栈有什么区别
    堆和栈的区别:1、内存中的位置不同;2、内存管理方面不同;3、生命周期不同;4、数据存储方式不同。堆是用于动态分配内存的区域,由程序员手动管理;栈是自动管理内存的区域,用于存储函数调用和局部变量等。堆具有更大的灵活性和更长的变量生命周期,但...
    99+
    2023-07-18
  • Java栈和队列怎么应用
    这篇“Java栈和队列怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java栈和队列怎么应用”文章吧。在学习栈和队列...
    99+
    2023-07-02
  • java数据结构中顺序队列和循环队列的区别是什么
    这篇文章主要介绍“java数据结构中顺序队列和循环队列的区别是什么”,在日常操作中,相信很多人在java数据结构中顺序队列和循环队列的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java数据结构中...
    99+
    2023-06-20
  • Java中栈内存和堆内存有什么区别
    在Java中,栈内存和堆内存是两种不同的内存区域,用于存储不同类型的数据。1. 栈内存:- 栈内存是由系统自动分配和释放的,用于存储...
    99+
    2023-08-16
    Java
  • 如何写Java栈和队列
    本文小编为大家详细介绍“如何写Java栈和队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何写Java栈和队列”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们知道,在数组中,若知道数据项的下标,便可立即访...
    99+
    2023-06-02
  • java堆内存和栈内存有什么区别
    Java中的堆内存和栈内存是两种不同的内存区域,主要用于存储不同类型的数据。1. 堆内存(Heap Memory):- 用于存储对象实例和数组等动态分配的数据。- 由Java虚拟机自动管理,通过垃圾回收机制来释放不再使用的对象占用的内存...
    99+
    2023-08-11
    java
  • Java中栈和队列如何相互转换
    这篇文章将为大家详细讲解有关Java中栈和队列如何相互转换,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。用栈实现队列...
    99+
    2023-06-29
  • Java的栈和队列实例分析
    这篇文章主要讲解了“Java的栈和队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的栈和队列实例分析”吧!栈package com.yuzhenc.collect...
    99+
    2023-06-29
  • java中 ${} 和 #{} 有什么区别
    目录前言1.功能不同1.1 ${} 的问题2.使用场景不同3.安全性不同3.1 使用 ${} 实现用户登录3.2 使用 #{} 实现用户登录总结前言 ${} 和 #{} 都...
    99+
    2024-04-02
  • Java栈与队列怎么实现
    本篇内容主要讲解“Java栈与队列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java栈与队列怎么实现”吧!1、实现循环队列【OJ链接】循环队列一般通过数组实现。我们需要解决几个问题。...
    99+
    2023-06-29
  • 一起来学习Java的栈和队列
    目录栈队列阻塞队列双端队列总结栈 package com.yuzhenc.collection; import java.util.Stack; public class Te...
    99+
    2024-04-02
  • Java中队列Queue和Deque的区别与代码实例
    目录一、Queue和Deque二、api对比三、代码实例1、queue2、deque总结一、Queue和Deque Queue以及Deque都是继承于Collection,Dequ...
    99+
    2024-04-02
  • Java中==和equals有什么区别
    本文小编为大家详细介绍“Java中==和equals有什么区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中==和equals有什么区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。== 是 Java...
    99+
    2023-06-27
  • Python栈和队列怎么实现
    这篇文章主要介绍“Python栈和队列怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python栈和队列怎么实现”文章能帮助大家解决问题。一、栈概述栈(st...
    99+
    2024-04-02
  • C++栈和队列怎么实现
    本篇内容主要讲解“C++栈和队列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++栈和队列怎么实现”吧!栈的定义和实现#ifndef Stack_H  #...
    99+
    2023-06-17
  • Go语言有没有队列和栈结构
    这篇文章主要介绍“Go语言有没有队列和栈结构”,在日常操作中,相信很多人在Go语言有没有队列和栈结构问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言有没有队列和栈结构”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作