Java基础复习笔记05数据结构-栈
java中常用的数据结构

java中常用的数据结构
Java中常用的数据结构有:
1. 数组(Array):一组具有相同类型的数据元素的集合,通
过索引来访问元素。
2. 链表(LinkedList):由若干个节点组成,每个节点包含数
据和指向下一个节点的指针。
3. 栈(Stack):一种后进先出(LIFO)的数据结构,只允许
在栈顶进行插入和删除操作。
4. 队列(Queue):一种先进先出(FIFO)的数据结构,只允
许在队头和队尾进行插入和删除操作。
5. 集合(Set):一种不允许重复元素的数据结构,常见的实
现类有HashSet和TreeSet。
6. 列表(List):一种有序的数据结构,允许重复元素,常见
的实现类有ArrayList和LinkedList。
7. 字典(Map):一种键值对的数据结构,以键作为唯一标识
符来存储和访问元素,常见的实现类有HashMap和TreeMap。
8. 堆(Heap):一种可以快速找到最大值(或最小值)的数
据结构,常用于优先队列的实现。
9. 树(Tree):一种层次关系的数据结构,包含根节点、子节
点和叶子节点等。
10. 图(Graph):由节点和节点之间的关系(边)组成的数据结构,常用于描述网络等复杂关系。
这些数据结构在Java中都有对应的类或接口,可以根据具体
的需求选择合适的数据结构来使用。
java 栈的用法

- 1 - java 栈的用法 栈是一种常见的数据结构,在Java中也有着重要的应用。本文将介绍Java栈的用法,包括栈的定义、栈的基本操作以及在Java中的使用。 一、栈的定义 栈是一种先进后出的数据结构,也可以称为LIFO(Last In First Out)结构。栈可以看作是一种线性结构,它只有一个入口和一个出口,数据只能从栈顶进入(入栈)或从栈顶出去(出栈)。当一个元素被加入到栈中时,它就被压入栈顶,当需要取出元素时,就从栈顶弹出。 二、栈的基本操作 栈的基本操作包括入栈、出栈、获取栈顶元素、判断栈是否为空等。 1. 入栈:将元素加入到栈顶。 2. 出栈:从栈顶弹出元素。 3. 获取栈顶元素:获取栈顶元素,但不弹出。 4. 判断栈是否为空:若栈为空,返回true;否则返回false。 三、Java中的栈 Java中提供了一个栈类Stack,它继承自Vector类。Stack类提供了许多方法,可以方便地实现栈的基本操作。 1. 入栈:使用push()方法将元素加入到栈顶。 2. 出栈:使用pop()方法从栈顶弹出元素。 - 2 -
3. 获取栈顶元素:使用peek()方法获取栈顶元素,但不弹出。 4. 判断栈是否为空:使用empty()方法判断栈是否为空。 下面是一个简单的例子,演示了如何使用Stack类实现栈的基本操作。 示例代码: import java.util.Stack; public class StackDemo { public static void main(String[] args) { // 创建一个栈 Stack stack = new Stack<>(); // 入栈 stack.push(1); stack.push(2); stack.push(3); // 获取栈顶元素 System.out.println('栈顶元素为:' + stack.peek()); // 出栈 System.out.println('弹出栈顶元素:' + stack.pop()); // 判断栈是否为空 System.out.println('栈是否为空:' + stack.empty()); } } - 3 -
数据结构(Java版)堆栈(Stack)

项目实践
调试运行例题3-1
穿越迷宫算法分析
boolean traverse(int row,int col ){ 定义TRIED为已尝试过标志 定义done为是否成功穿越标志 创建起点的位置坐标对象start 创建一个栈用来存放迷宫位置坐标 start进栈 当栈不空时,循环做如下操作{ 出栈一个位置坐标对象 获取该坐标的x和y值 将该坐标对应的数组元素置为TRIED标志 如果该坐标对应数组最后一个元素的下标(迷宫出口位置 ),则置done为true 将当前位置坐标的上一个位置坐标压栈(如果该位置坐标有效,且可通过) 将当前位置坐标的左一个位置坐标压栈(如果该位置坐标有效,且可通过) 将当前位置坐标的右一个位置坐标压栈(如果该位置坐标有效,且可通过) 将当前位置坐标的下一个位置坐标压栈(如果该位置坐标有效,且可通过) } return done; }
课堂实训
通过例题3-1的学习,我们掌握了顺序栈 的设计与实现,那么链式栈应如何设计 并实现呢?。请按47页的指导步骤进行 实训.
Java类库中的栈 Stack类
对于J2SDK1.4.2,Stack类具有栈结构的功能,它位于 包java.util包中,其直接父类是Vector类,常用的构造 器方法和成员方法如下: (1)Stack(),构造器方法可用来创建一个栈。 (2)public Object push(Object item) ,进栈一个元素。 (3)public synchronized Object pop(),出栈一个元素。 (4)public boolean empty(),判断栈是否为空。 (5)public int size(),获取栈中元素个数,从父类中继 承。
解题思路
从(0,0)位置开始,对该位置相邻的上、下、左、 右四个位置进行判断,通过选取一个可能畅通的 位置作为下一步穿越的位置。这里用一个栈来存 放要穿越的迷宫位置坐标,并首先将坐标(0,0)进 栈。然后用循环语句重复执行下面操作。 弹出栈顶元素,若该位置上的值为1,则将其置为 TRIED标识,然后将该位置的4个可能穿越的位置 坐标(下、右、左、上)进栈,进行下一次循环, 直到到达最后一个位置。如果最后一个位置上的 元素也被标识为TRIED,则说明成功穿越迷宫。 当栈为空时结束循环。
Java栈的三种实现方式(完整版)

Java栈的三种实现⽅式(完整版)java什么是栈系统中的堆、栈和数据结构堆、栈不是⼀个概念。
可以说系统中的堆、栈是真实的内存物理区,数据结构中的堆、栈是抽象的数据存储结构。
栈:实际上就是满⾜后进先出的性质,是⼀种数据项按序排列的数据结构,只能在⼀端(称为栈顶(top))对数据项进⾏插⼊和删除。
栈区(stack)— 由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。
其操作⽅式类似于数据结构中的栈。
栈的优势是,存取速度⽐堆要快,仅次于直接位于CPU中的寄存器。
但缺点是,存在栈中的数据⼤⼩与⽣存期必须是确定的,缺乏灵活性。
代码:Stack的基本使⽤初始化Stack stack=new Stack判断是否为空stack.empty()取栈顶值(不出栈)stack.peek()进栈stack.push(Object);出栈stack.pop();实例:public class Test01 {public static void main(String[] args) {Stack stack=new Stack();//1.empty()栈是否为空System.out.println(stack.empty());//2.peek()栈顶值 3.进栈push()stack.push(new Integer(1));stack.push("b");System.out.println(stack.peek());//4.pop()出栈stack.pop();System.out.println(stack.peek());}}栈的主要操作1. void push(int data):将data(数据)插⼊栈2. int pop():删除并返回最后⼀个插⼊栈的栈的辅助操作1. int top():返回最后⼀个插⼊栈的元素,但不删除2. int size():返回存储在栈中的元素的个数3. int isEmpty():判断栈中是否有元素4. int isStackFull():判断栈中是否满元素实现栈抽象数据类型有多种实现⽅式。
数据结构(一)——线性表、栈和队列

数据结构(⼀)——线性表、栈和队列数据结构是编程的起点,理解数据结构可以从三⽅⾯⼊⼿:1. 逻辑结构。
逻辑结构是指数据元素之间的逻辑关系,可分为线性结构和⾮线性结构,线性表是典型的线性结构,⾮线性结构包括集合、树和图。
2. 存储结构。
存储结构是指数据在计算机中的物理表⽰,可分为顺序存储、链式存储、索引存储和散列存储。
数组是典型的顺序存储结构;链表采⽤链式存储;索引存储的优点是检索速度快,但需要增加附加的索引表,会占⽤较多的存储空间;散列存储使得检索、增加和删除结点的操作都很快,缺点是解决散列冲突会增加时间和空间开销。
3. 数据运算。
施加在数据上的运算包括运算的定义和实现。
运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
因此,本章将以逻辑结构(线性表、树、散列、优先队列和图)为纵轴,以存储结构和运算为横轴,分析常见数据结构的定义和实现。
在Java中谈到数据结构时,⾸先想到的便是下⾯这张Java集合框架图:从图中可以看出,Java集合类⼤致可分为List、Set、Queue和Map四种体系,其中:List代表有序、重复的集合;Set代表⽆序、不可重复的集合;Queue代表⼀种队列集合实现;Map代表具有映射关系的集合。
在实现上,List、Set和Queue均继承⾃Collection,因此,Java集合框架主要由Collection和Map两个根接⼝及其⼦接⼝、实现类组成。
本⽂将重点探讨线性表的定义和实现,⾸先梳理Collection接⼝及其⼦接⼝的关系,其次从存储结构(顺序表和链表)维度分析线性表的实现,最后通过线性表结构导出栈、队列的模型与实现原理。
主要内容如下:1. Iterator、Collection及List接⼝2. ArrayList / LinkedList实现原理3. Stack / Queue模型与实现⼀、Iterator、Collection及List接⼝Collection接⼝是List、Set和Queue的根接⼝,抽象了集合类所能提供的公共⽅法,包含size()、isEmpty()、add(E e)、remove(Object o)、contains(Object o)等,iterator()返回集合类迭代器。
Java里的堆(heap)栈(stack)和方法区(method)

Java⾥的堆(heap)栈(stack)和⽅法区(method)基础数据类型直接在栈空间分配,⽅法的形式参数,直接在栈空间分配,当⽅法调⽤完成后从栈空间回收。
引⽤数据类型,需要⽤new来创建,既在栈空间分配⼀个地址空间,⼜在堆空间分配对象的类变量。
⽅法的引⽤参数,在栈空间分配⼀个地址空间,并指向堆空间的对象区,当⽅法调⽤完成后从栈空间回收。
局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量⽣命周期结束后,栈空间⽴刻被回收,堆空间区域等待GC回收。
⽅法调⽤时传⼊的 literal 参数,先在栈空间分配,在⽅法调⽤完成后从栈空间分配。
字符串常量在DATA 区域分配,this 在堆空间分配。
数组既在栈空间分配数组名称,⼜在堆空间分配数组实际的⼤⼩!哦对了,补充⼀下static在DATA区域分配。
从Java的这种分配机制来看,堆栈⼜可以这样理解:堆栈(Stack)是操作系统在建⽴某个进程时或者线程(在⽀持多线程的操作系统中是线程)为这个线程建⽴的存储区域,该区域具有先进后出的特性。
每⼀个Java应⽤都唯⼀对应⼀个JVM实例,每⼀个实例唯⼀对应⼀个堆。
应⽤程序在运⾏中所创建的所有类实例或数组都放在这个堆中,并由应⽤所有的线程共享.跟C/C++不同,Java中分配堆内存是⾃动初始化的。
Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引⽤却是在堆栈中分配,也就是说在建⽴⼀个对象时从两个地⽅都分配内存,在堆中分配的内存实际建⽴这个对象,⽽在堆栈中分配的内存只是⼀个指向这个堆对象的指针(引⽤)⽽已。
<⼆>这两天看了⼀下深⼊浅出JVM这本书,推荐给⾼级的java程序员去看,对你了解JAVA的底层和运⾏机制有⽐较⼤的帮助。
废话不想讲了.⼊主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和⽅法区(method)堆区:1.存储的全部是对象,每个对象都包含⼀个与之对应的class的信息。
java栈的用法
java栈的用法Java栈的用法Java栈是一种非常重要的数据结构,它在Java语言中广泛应用于各种场景,例如方法调用、异常处理、表达式求值等。
本文将介绍Java栈的基本概念、常见操作以及实现方式等内容。
一、基本概念1. 栈的定义栈是一种线性数据结构,它具有后进先出(Last In First Out,LIFO)的特点。
栈可以看作是一个容器,只能在容器的一端进行插入和删除操作。
插入操作称为“进栈”或“压栈”,删除操作称为“出栈”。
2. 栈的实现方式Java中可以使用数组或链表来实现栈。
使用数组实现时,需要定义一个固定大小的数组,并记录当前栈顶元素位置;使用链表实现时,则需要定义一个头节点和一个指向当前节点的指针。
3. 栈的应用场景Java栈在很多场景下都有着重要的应用,例如:- 方法调用:每当调用一个方法时,都会创建一个新的栈帧并压入当前线程对应的虚拟机栈中。
- 异常处理:当抛出异常时,JVM会创建一个异常对象,并将其压入当前线程对应的虚拟机栈中。
- 表达式求值:通过使用两个栈,一个存放操作数,一个存放运算符,可以实现表达式的求值。
二、常见操作1. 压栈(push)将一个元素压入栈顶。
Java代码示例:```public void push(E item) {ensureCapacity(size + 1);elements[size++] = item;}```2. 出栈(pop)弹出栈顶元素,并返回该元素。
Java代码示例:```public E pop() {if (size == 0)throw new EmptyStackException();E result = elements[--size];elements[size] = null; // 避免内存泄漏 return result;}```3. 查看栈顶元素(peek)返回当前栈顶元素,但不弹出该元素。
Java代码示例:```public E peek() {if (size == 0)throw new EmptyStackException(); return elements[size - 1];}```4. 判断是否为空(isEmpty)判断当前栈是否为空。
javastack方法
javastack方法在Java编程语言中,栈(Stack)是一种数据结构,它遵循先进后出(LIFO)的原则。
它可以被看作是一种特殊类型的列表,其中只有一端可以进行插入和删除操作。
在Java中,栈类是通过Stack类实现的。
Stack类提供了以下常用的方法:1. push(E element): 将元素压入栈顶。
该方法会将元素添加到栈的顶部,并返回插入的元素。
2. pop(: 弹出栈顶元素。
该方法会移除并返回栈顶的元素。
3. peek(: 返回栈顶的元素,但不移除它。
该方法只返回栈顶的元素,并不会对栈进行任何修改。
4. empty(: 检测栈是否为空。
该方法会返回一个布尔值来表示栈是否为空。
如果栈为空,则返回true,否则返回false。
5. search(Object element): 查找元素在栈中的位置。
该方法会返回元素在栈中的位置,如果元素不存在于栈中,则返回-1下面是一个示例程序,演示了如何使用Stack类的方法:```javaimport java.util.Stack;public class StackExamplepublic static void main(String[] args)Stack<Integer> stack = new Stack<>(;// 使用push方法将元素推入栈中stack.push(10);stack.push(20);stack.push(30);stack.push(40);stack.push(50);// 使用peek方法获取栈顶元素System.out.println("栈顶元素: " + stack.peek();// 使用pop方法弹出栈顶元素System.out.println("弹出栈顶元素: " + stack.pop();// 使用search方法查找元素在栈中的位置int position = stack.search(20);if (position != -1)System.out.println("元素20在栈中的位置是: " + position); } elseSystem.out.println("元素20不存在于栈中");}// 使用empty方法检测栈是否为空if (stack.empty()System.out.println("栈为空");} elseSystem.out.println("栈不为空");}}```运行上述代码,会输出以下结果:```栈顶元素:50弹出栈顶元素:50元素20在栈中的位置是:3栈不为空```这是一个基本的使用栈的示例程序。
Java数据结构和算法笔记
Java数据结构和算法笔记篇一:Java数据结构和算法笔记Java数据结构和算法第0讲综述参考教材:Java数据结构和算法(第二版),[美]Robertlafore 1.数据结构的特性数据结构数组有序数组栈队列链表二叉树红-黑树2-3-4树哈希表堆图优点比无序的数组查找快提供后进先出方式的存取提供先进先出方式的存取插入快,删除快查找、插入、删除都快;树总是平衡的查找、插入、删除都快;树总是平衡的;类似的树对磁盘存储有用如果关键字已知,则存储极快;插入快插入、删除快;对大数据项的存取很快对现实世界建模缺点删除和插入慢,大小固定存取其他项很慢存取其他项很慢查找慢算法复杂算法复杂删除慢,如果不知道关键字则存储很慢,对存储空间使用不充分对其他数据项存取慢有些算法慢且复杂插入快;如果知道下标,可以非常快地存取查找慢,删除慢,大小固定查找、插入、删除都快(如果树保持平衡)删除算法复杂2.经典算法总结查找算法:线性查找和二分查找排序算法:用表展示第一讲数组1.Java中数组的基础知识1)创建数组在Java中把数组当作对象来对待,因此在创建数组时必须使用new操作符:一旦创建数组,数组大小便不可改变。
2)访问数组数据项数组数据项通过方括号中的下标来访问,其中第一个数据项的下标是0:3)数组的初始化当创建数组之后,除非将特定的值赋给数组的数据项,否则它们一直是特殊的null对象。
2.面向对象编程方式1)使用自定义的类封装数组2)添加类方法实现数据操作测试MyArray类方法:3.有序数组1)有序数组简介以及其优点有序数组是一种数组元素按一定的顺序排列的数组,从而方便使用二分查找来查找数组中特定的元素。
有序数组提高了查询的效率,但并没有提高删除和插入元素的效率。
2)构建有序数组将2.1中自定义的类封装数组MyArray的方法改为如下:4.查找算法1)线性查找在查找过程中,将要查找的数一个一个地与数组中的数据项比较,直到找到要找的数。
java堆栈的用法 -回复
java堆栈的用法-回复Java堆栈的用法在Java编程中,堆栈(Stack)是一种线性数据结构,它遵循“先进后出”(Last In, First Out)的原则。
在这篇文章中,我们将详细讨论Java堆栈的用法,并一步一步回答与之相关的问题。
# 什么是Java堆栈?Java堆栈是一种特殊的数据结构,由一系列元素组成。
每当新的元素插入到堆栈中时,它就会被放置在堆栈的顶部。
只有位于堆栈顶部的元素可以被访问和操作,而其他元素则被视为不可见。
当需要删除一个元素时,只能删除位于堆栈顶部的元素,并且只能删除最后一个插入的元素。
这种数据结构使得堆栈可以用来跟踪程序执行过程中的方法调用和变量存储。
# Java堆栈的主要用途是什么?Java堆栈主要用于两个目的:方法调用和变量存储。
1. 方法调用:在Java程序中,方法是相互调用的。
当一个方法被调用时,它会被添加到堆栈的顶部,称为"压栈"。
当方法执行完毕后,它会从堆栈中删除,称为"弹栈"。
这种调用机制使用了Java堆栈的特殊属性,使得程序能够按照特定的顺序执行方法。
2. 变量存储:Java堆栈可以存储局部变量和临时变量。
当一个方法被调用时,它会在堆栈上分配一些内存来存储这些变量。
这些变量的生命周期与方法的执行时间相对应。
当方法执行完毕后,这些变量也会被删除。
# 如何使用Java堆栈?使用Java堆栈需要以下步骤:步骤1:导入Java.util包在Java程序中使用堆栈,需要导入`java.util.Stack`包。
import java.util.Stack;步骤2:创建堆栈对象在程序中,可以使用`Stack`类来创建一个堆栈对象。
Stack<String> stack = new Stack<String>();在上面的代码中,我们创建了一个`Stack`对象,用于存储`String`类型的元素。
步骤3:压栈要在堆栈中添加元素,可以使用`push()`方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 / 9 Java基础复习笔记05数据结构-栈 刘岩 Email:suhuanzheng7784877@163.com 1. 栈 栈是一种比较特殊的线性表,它的原则就是先进后出,后进先出。你就把他想做一个你放书的大箱子,要想看放在最底层的书(压箱底的),那么得先拿出来上面的所有书之后那本最底层的书才能取到。同样栈也是这个意思。
2. 栈的操作 栈的操作比线性表的操作要少一些,这也可以看出来栈结构实际上就是在线性表的基础上加了一些不能进行的操作才叫做栈。栈的操作有:入栈、出栈、访问栈顶元素、清空栈。 3. 栈的使用场景 展示一个比较有用的结构,比如做语法分析、递归、支持撤消都可以使用栈来实现。 4. 栈的顺序实现 栈的顺序实现和线性表的顺序实现差不多,都是用一个数组来进行数据的存取。 如下 package dateStructer.stack;
/** * 栈的顺序实现 * @author liuyan * @param */ public class MyArrayStack {
// 临时数组 2 / 9
private Object[] objects; // 默认临时数组的初始大小 private final static int Def_Size = 16;
// 记录实实在在的元素个数 private int elementSize;
public MyArrayStack() { objects = new Object[Def_Size]; }
/** * 栈顶添加元素 * @param e */ public void push(E e) {
if (elementSize == 0) { objects[0] = e; elementSize++; return; }
for (int i = 0; i < objects.length; i++) { if (objects[i] == null) { objects[i] = e; elementSize++; break; } }
} /** * 从栈顶出元素,删除栈顶元素 * * @return */ public E pop() { if (isEmpty()) { throw new RuntimeException("栈已经空"); } E lastElement = (E) objects[elementSize - 1]; 3 / 9
objects[elementSize - 1] = null; elementSize--;
return lastElement; }
/** * 从栈顶出元素,不删除栈顶元素 * * @return */ public E peek() { if (isEmpty()) { throw new RuntimeException("栈已经空"); }
E lastElement = (E) objects[objects.length - 1]; return lastElement; }
/** * 栈空间大小 * @return */ public int getSize() { return elementSize; }
/** * 栈是否为空 * @return */ public boolean isEmpty() { return elementSize == 0; }
/** * 清空所有元素 */ public void clear() { for (int i = 0; i < elementSize; i++) { objects[i] = 0; } 4 / 9
elementSize = 0; }
@Override public String toString() {
StringBuffer str = new StringBuffer("["); for (int i = 0; i < elementSize; i++) { str.append("[" + objects[i].toString() + "],"); } if (elementSize > 0) { return str.substring(0, str.lastIndexOf(",")) + "]"; }
return str.append("]").toString(); } }
5. 栈的链表实现 使用链表结构实现栈其实用一个栈顶临时标记记录着时刻变化的栈顶元素即可,算法如下 package dateStructer.stack;
public class MyLinkStack { /** * 单向链表结构 */ public class LinkNode {
// 真正的数据域 private E date;
// 记录下一个节点 private LinkNode nextLinkNode;
public LinkNode() { } 5 / 9
public LinkNode(E date, LinkNode nextLinkNode) { this.date = date; this.nextLinkNode = nextLinkNode; } }
// 结点个数 private int elementSize;
// 头结点 private LinkNode topNode;
public MyLinkStack() { topNode = new LinkNode(); }
/** * 栈顶添加元素 * * @param e */ public void push(E e) {
if (elementSize == 0) { if (topNode == null) { topNode = new LinkNode(e, null); } else { topNode.date = e; } elementSize++; return; }
LinkNode linkNode = topNode; LinkNode linkNodeNewTop = new LinkNode(e, linkNode); topNode = linkNodeNewTop; elementSize++; }
/** * 从栈顶出元素,删除栈顶元素 * 6 / 9
* @return */ public E pop() { if (isEmpty()) { throw new RuntimeException("栈已经空"); }
LinkNode linkNode = topNode; topNode = topNode.nextLinkNode; E date = linkNode.date; linkNode.date = null; linkNode.nextLinkNode = null;
elementSize--; return date; }
/** * 从栈顶出元素,不删除栈顶元素 * * @return */ public E peek() { if (isEmpty()) { throw new RuntimeException("栈已经空"); }
E date = topNode.date; return date; }
/** * 栈空间大小 * * @return */ public int getSize() { return elementSize; } 7 / 9
/** * 栈是否为空 * * @return */ public boolean isEmpty() { return elementSize == 0; }
/** * 清空所有元素 */ public void clear() { LinkNode linkNode = topNode; for (int i = 0; i < elementSize; i++) { linkNode.date = null; linkNode = linkNode.nextLinkNode; }
elementSize = 0; }
@Override public String toString() {
StringBuffer str = new StringBuffer("["); LinkNode linkNode = topNode; for (int i = 0; i < elementSize; i++) { str.append("[" + linkNode.date.toString() + "],"); linkNode = linkNode.nextLinkNode; }
if (elementSize > 0) { return str.substring(0, str.lastIndexOf(",")) + "]"; }
return str.append("]").toString(); } } 测试代码同顺序栈的测试代码相同,在此就不在赘述。这里面利用了一个topNode变量