java 栈_Java实现单链表、栈、队列三种数据结构
作者:远航
cnblogs.com/yang-guang-zhang/p/13884023.html
一、单链表
1、在我们数据结构中,单链表非常重要。它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList、HashMap(数组加链表)等等的底层都是用链表实现的。
2、下面是单链表的几个特点:
数据元素在内存中存放的地址是不连续的:单链表的结点里面还定义一个结点,它里面保存着下一个结点的内存地址,在实例化对象的时候,jvm会开辟不同内存空间,并且是不连续的。
添加效率高:添加一个元素时,先找到插入位置的前一个,只需要将1,2个元素的连接断开,将插入结点的next指向第一个元素的next
(1),然后将第一个元素的next指向插入结点(2),
不用在挪动后面元素。
删除效率高:删除一个元素时,先找到删除位置,将前一个的next指向删除位置的next,不用在挪动后面元素。
查询效率低:查询的时候必须从头开始,依次遍历,而数组因为它的内存是连续的,可以直接通过索引查找。
3、下面通过代码来实现单链表结构:
package com.tlinkedList;
/*** User:zhang* Date:2020/10/26**/public class TLinkedList<T> { private Node head;//链表头部 private int size;//链表元素的个数 public TLinkedList(){ head=null; size=0; }// 将结点作为内部类。也可以新建一个Node类,作为结点 class Node{ private Node next;//下一个结点 private T t;//结点的数据 public Node(T t){ this.t=t; }
public T getT() { return t; }
public void setT(T t) { this.t = t; } }// 在链表头部添加一个结点 public void addFirst(T t){ Node node = new Node(t); node.next=head; head=node; size++; }// 在链表中间添加一个结点 public void addMid(T t,int index){ Node node = new Node(t); Node mid=head; for (int i = 0; i 1; i++) { mid=mid.next; } node.next=mid.next; mid.next=node; size++; }// 在链表尾部添加一个结点 public void addLast(T t){ Node node = new Node(t); Node last=head; while (last.next!=null){ last=last.next; } last.next=node; node.next=null; size++; }// 删除链表的头结点 public void removeFirst(){ head=head.next; size--; }// 删除链表的中间元素 public void removeMid(int index){ Node mid=head; if (index==0){ removeFirst(); return; } int j=0; Node qMid=head; while (j qMid=mid; mid=mid.next; j++; } qMid.next=mid.next; size--; }// 删除链表的尾结点 public void removeLast(){ Node mid=head; Node qMid=head; while (mid.next!=null){ qMid=mid; mid=mid.next; } qMid.next= null; size--; }// 获取链表指定下标的结点 public Node get(int index){ Node mid=head; if (index==0){ return head; } int j=0; while (j mid=mid.next; j++; } return mid; } public static void main(String[] args) { TLinkedList linkedList = new TLinkedList<>(); linkedList.addFirst("hello1"); linkedList.addFirst("hello2"); linkedList.addFirst("hello3");for (int i = 0; i System.out.println(linkedList.get(i).getT()); }// linkedList.removeLast();// linkedList.removeFirst();// linkedList.addLast("hello4"); linkedList.addMid("hello",2); System.out.println("--------------");for (int i = 0; i System.out.println(linkedList.get(i).getT()); } }}
结果如下:
二、栈(Stack)
1、一提到栈我们脑海就会浮现四个字“先进后出”,没错,它就是栈的最大特点。
2、栈的应用场景也非常多,比如将字符串反转、jvm里面的栈区等等。
3、栈里面的主要操作有:
- push(入栈):将一个数据元素从尾部插入
- pop(出栈):将一个数据元素从尾部删除
- peek(返回栈顶元素):将栈顶元素的数据返回
相当于只有一个开口就是尾部,只能从尾进,从尾出。
4、下面通过链表结构实现栈结构:
package com.tStack;
/*** User:zhang* Date:2020/10/26**/public class Test_Stack<T> { private Node head;//栈的头结点 private int size;//栈的元素个数 class Node{ private Node next;//下一个结点 private T t;//结点的数据 public Node(T t){ this.t=t; }
public T getT() { return t; }
public void setT(T t) { this.t = t; } }
public Test_Stack() { head=null; size=0; }
public static void main(String[] args) { Test_Stack TStack = new Test_Stack<>(); TStack.push("hello1"); TStack.push("hello2"); TStack.push("hello3");for (int i = 0; i 3; i++) { System.out.println(TStack.pop()); } }// 入栈public void push(T t){ Node node = new Node(t);if (size==0){ node.next=head; head=node; size++;return; }if (size==1){ head.next=node; node.next=null; size++;return; } Node lastNode=head;while (lastNode.next!=null){ lastNode=lastNode.next; } lastNode.next=node; node.next=null; size++; }// 出栈public T pop(){if (size==0){ System.out.println("栈内无值");return null; }if (size==1){ T t = head.getT(); head=null; size--;return t; } Node lastNode=head; Node qNode=head;while (lastNode.next!=null){ qNode=lastNode; lastNode=lastNode.next; } T t = lastNode.getT(); qNode.next=null; size--;return t; }// 获取栈里面元素的个数public int getSize(){return size; }// 返回栈顶元素public T peek(){if (size==0){ System.out.println("栈内无值");return null; }if (size==1){return head.getT(); } Node lastNode=head;while (lastNode.next!=null){ lastNode=lastNode.next; }return lastNode.getT(); }}
结果:
三、队列(Queue)
1、队列的特点也用“先进先出”四个字来概括。就是先进去的元素先输出出来。
2、我们常见的消息队列就是队列结构实现的。
3、队列的常见操作如下:
- put(入队):将一个结点插入到尾部。
- pop(出队):将头结点的下一个结点作为头,然后将原来的头结点删除。
4、通过链表结构实现队列:
package com.tQueue;
/** * User:zhang * Date:2020/10/26 **/public class TQueue<T> { private Node front;//头结点 private Node tail;//尾结点 private int size;//队列中元素的个数 class Node { private Node next;//下一个结点 private T t;//结点的数据
public Node(T t) { this.t = t; }
public T getT() { return t; }
public void setT(T t) { this.t = t; } } public int getSize() { return size; }
public void setSize(int size) { this.size = size; }
public TQueue() { front = tail = null; }
// 入队 public void put(T t) { Node node = new Node(t); if (size == 0) { front = tail = node; size++; return; } Node lastNode = front; while (lastNode.next != null) { lastNode = lastNode.next; } lastNode.next = node; tail = node; size++; }
// 出队 public T pop() { if (size == 0) { System.out.println("队列中无值"); return null; } T t = front.getT(); front=front.next; size--; return t; }
public static void main(String[] args) { TQueue tQueue = new TQueue<>(); tQueue.put("Hello1"); tQueue.put("Hello2"); tQueue.put("Hello3");for (int i = 0; i 3; i++) { System.out.println(tQueue.pop()); } }}
结果:
文章有不足之处,欢迎大家留言指正,谢谢大家啦!
END
推荐好文
强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!
为什么MySQL不推荐使用uuid或者雪花id作为主键?
为什么建议大家使用 Linux 开发?爽(外加七个感叹号)
IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)
炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)
记一次由Redis分布式锁造成的重大事故,避免以后踩坑!
十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统(附源码)
java 栈_Java实现单链表、栈、队列三种数据结构相关推荐
- Java实现单链表、栈、队列三种数据结构
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:远航 cnblogs.com/yang-guang- ...
- Java转置_Java实现单链表的逆转置
单链表逆转置的递归与非递归方式 package link.reverse; // 定义一个单链表 class Node { //变量 private int record; //指向下一个对象 pri ...
- c语言双链表排序交换节点_图解:单链表翻转的三种方式!
当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转. 单链表反转,反转后的效果如下: 看起来很简单,只需要将单链表所有结点的 nex ...
- 静态资源java 配置文件_java web 静态资源访问配置三种方式
方案一:Tomcat的defaultServlet来处理静态文件 要放在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了 方案二 ...
- 借助于栈结构将一个单链表逆置
借助于栈结构将一个单链表逆置. 输入输出样例:1组 #1 样例输入: 5 //链表中有几个元素 1 2 3 4 5 //链表中的元素分别是什么 样例输出: 5 4 3 2 1 //逆置后输出,利用栈结 ...
- java带头结点空单链表_Java版带头结点单链表的实现
Java版带头结点单链表的实现 Java版带头结点单链表的实现 package dsr; public interface IList { public void clear();//8 public ...
- java 反转jia链表_Java实现单链表反转
本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { public static void main(S ...
- 第7周项目实践2.1 用只有尾节点指针rear的循环单链表实现队列算法库
//用只有尾节点指针rear的循环单链表作为队列存储结构,其中每个节点的类型为LinkNode,rear指针用于唯一标识链队 typedef struct LinkNode {int date;Lin ...
- 单链表实现队列的基本操作(入队,出队)
单链表实现队列的基本操作(包括初始化队列,入队,出队) 构造队列结构体 struct node {int data;node *next; };struct queue {node *head, *t ...
最新文章
- python 字符串输入时间_Python input()函数:获取用户输入的字符串
- 微软官方再次上线了Python教程,这次比较高级
- Hadoop 之父趣事:用儿子的大象玩偶为大数据项目命名
- vb.net与c#相互转换工具
- android:windowSoftInputMode属性
- Excel导入sqlserver
- 大学计算机基础实验指导试题,(大学计算机基础实验指导)模拟试题(二)参考答案...
- 如何使用验证控件对DropDownList进行验证
- 旧调重弹-SetUnhandledExceptionFilter的使用问题
- Jsoup解析html某片段的问题
- MyEclipse代码提示快捷键和常用设置
- vue中使用axios发送请求(二)
- Data crossstore between Mongo and JPA
- 全局变量在多个进程中不共享
- TCP,IP,UDP等各种报文格式
- asp 服务器文件重命名,aspupload文件重命名及上传进度条的解决方法附代码
- FIR 线性相位系统 最小相位系统 滤波器延迟
- MyBatis主键回填
- python第一周习题
- python和stata怎么结合_双剑合璧之Stata与Python:初识IPyStata
热门文章
- Leetcode 690
- cocos creator基础-(三十一)超大数值计算
- python的list()列表数据类型的方法详解
- Linux内核分析:recv、recvfrom、recvmsg函数实现
- 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
- 前年的斐波那契蹲在地上看着你,笑而不语
- hibernate配置文件hibernate.cfg.xml的详细解释
- zoj1134 Strategic Game(DP/图论)
- 构建插件式的应用程序框架(四)----服务容器
- [WCF]相关资料整理