Java基于链表实现栈的方法详解
作者:WFaceBoss 发布时间:2022-07-02 11:39:20
标签:Java,链表,栈
本文实例讲述了Java基于链表实现栈的方法。分享给大家供大家参考,具体如下:
在上几小节中我们实现了基本的链表结构,并在上一节的底部给出了有关链表的源码,此处在贴一次吧,猛戳
在开始栈的实现之前,我们再来看看关于链表的只在头部进行的增加、删除、查找操作,时间复杂度均为O(1),基于链表的这几个优势,我们在此基础上实现栈。
前言,在写本小节之前,我们已经实现了一个基于静态数组的栈,转到查看。此处我们实现基于链表的栈。
1.链表类拷贝到Stack 包下:
在实现基于静态数组的栈的时候,我们已经新建了一个package,此时我们将已经实现的链表类拷贝到该package下,目录结构为:
2.实现栈
新建一个LinkedListStack类,实现Stack接口,相关代码如下:
Stack接口:
package Stack;
public interface Stack<E> {
//栈中元素个数
int getSize();
//栈中元素个数是否为空
boolean isEmpty();
//进栈
void push(E e);
//出栈
E pop();
//查看栈顶元素
E peek();
}
个LinkedListStack类:
package Stack;
public class LinkedListStack<E> implements Stack<E> {
private LinkedList<E> list;
public LinkedListStack() {
list = new LinkedList<E>();
}
//栈中元素个数
@Override
public int getSize() {
return list.getSize();
}
//栈中是否为空
@Override
public boolean isEmpty() {
return list.isEmpty();
}
//在栈中添加元素
@Override
public void push(E e) {
list.addFirst(e);
}
//从栈中删除第一个元素
@Override
public E pop() {
return list.removeFirst();
}
//查看栈中第一个元素
@Override
public E peek() {
return list.getFirst();
}
//主要是便于输出给对象信息
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("Stack: top ");
res.append(list);
return res.toString();
}
}
3.添加测试代码
为了测试的简单,我们在已经实现了Stack接口的LinkedListStack类中建立以main()方法,main中代码如下:
//测试
public static void main(String[] args) {
LinkedListStack<Integer> stack = new LinkedListStack<Integer>();
for (int i = 0; i < 5; i++) {
stack.push(i);
System.out.println(stack);
}
System.out.println("出栈一个元素:");
stack.pop();
System.out.println(stack);
}
结果为:
到此我们实现了底层是链表的栈。
关于本小节,若您觉得还行、还过得去,记得给个推荐哦~,谢谢!!
本节源码 https://github.com/FelixBin/dataStructure/blob/master/src/Stack/LinkedListStack.java
希望本文所述对大家java程序设计有所帮助。
来源:https://www.cnblogs.com/wfaceboss/p/10643690.html
0
投稿
猜你喜欢
- 参考视频:https://www.bilibili.com/video/BV1Bq4y1Q7GZ?p=4通过视频的学习和自身的理解整理出的笔
- 本文实例讲述了Java使用synchronized实现互斥锁功能。分享给大家供大家参考,具体如下:代码package per.thread;
- 一、注解(annotations)列表@SpringBootApplication:包含了@ComponentScan、@Configura
- Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程
- 导入thymeleaf<dependency> <groupId>org.springframework
- 1.概览该教程中,我将向你展示:如何在测试时设置spring boot 日志级别。虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测
- 环境:Spring5.3.12.RELEASE。Spring 3引入了一个core.onvert包,提供一个通用类型转换系统。系统定义了一个
- 本文实例讲述了Java接口的简单定义与实现方法。分享给大家供大家参考,具体如下:1、接口是Java中最终要的概念,接口可以理解为一种特殊的类
- 1、SpringBoot配置文件1.1 优先级关于SpringBoot配置文件可以是properties或者是yaml格式的文件,但是在Sp
- 本文实例为大家分享了Java基于Socket实现简易版多人聊天室的具体代码,供大家参考,具体内容如下一、 聊天室需求1、一个服务端,多个客户
- java Mybatis存进时间戳封装了一个实体类,里面有个字段 Integer createTime。要利用这个实体类将一个时间戳存进数据
- 本章是后续学习的基石,只有充分理解了分布式系统的概念和面临的问题,以及ZooKeeper内部的概念,才能懂得ZooKeeper是如何对分布式
- (注意:本文基于JDK1.8)前言元素在存储到内存中,当我们需要使用在内存中存储的元素,这就涉及到在内存中查找元素,今天一起学习Vector
- 在线程中有两种常用的方法,能够通过数组实现相应的功能,但除此之外在区别上也是很明显的。本篇就其中的代表方法ArrayList和Vector进
- 解决Spring in action @valid验证不生效按照书上的示例代码来实现但是,添加了验证但是没有生效。Spring提供了校验Ap
- 一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的if else等判断逻辑,特别是在不同方法
- 前言:封装、继承和多态是面向对象编程的三大特征。1.封装1.1.封装概念封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据
- # 前言在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信
- 一、Java IO流1、概念在Java中,把不同的输入源 / 输出源(如:键盘、文件、网络链接等)抽象的表述为“流”(stream)通过 ”
- 1.为什么要使用synchronized在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字syn