栈的Java实现--链栈

2023-05-16

栈的Java实现--链栈

链栈,顾名思义,就是以链表的形式实现的栈的相关操作,其实是功能弱化了的链表,如果已经阅读过链表的实现代码,那么链栈的实现显得更为容易。

 

链栈的基本结构:


链栈的入栈操作:

  •  让top引用指向新的节点,新节点的next指向原来的top
  • 记录栈内元素个数的size+1


链栈的出栈操作:

  •  top引用指向原栈顶元素的下一个元素(top.next),并释放原栈顶元素的引用
  • 记录栈内元素个数的size-1

 链栈的Java实现代码:

 

package com.liuhao.DataStructures;

public class LinkStack<T> {

	private class Node {
		private T data;// 保存节点的数据元素
		private Node next;// 保存下一个节点的引用

		public Node() {
		}

		public Node(T data, Node next) {
			this.data = data;
			this.next = next;
		}
	}

	private Node top;// 存放栈顶节点
	private int size = 0;// 存放栈中已有的元素个数

	// 创建空链栈
	public LinkStack() {
		top = null;
	}

	// 已指定数据元素创建链栈,只有一个元素
	public LinkStack(T element) {
		top = new Node(element, null);
		size++;
	}

	// 返回链栈的长度
	public int length() {
		return size;
	}

	// 进栈
	public void push(T elemnt) {
		// 让top指向新节点,新节点的next指向原来的top
		top = new Node(elemnt, top);
		size++;
	}

	// 出栈
	public T pop() {
		// 若当前为空栈,则返回null
		if (size == 0) {
			return null;
		}

		Node oldTop = top;
		// 让top指向原栈顶的下一个节点
		top = top.next;

		// 释放原栈顶元素的引用
		oldTop.next = null;
		size--;

		return oldTop.data;
	}

	// 获取栈顶元素
	public T getTop() {
		// 若当前为空栈,则返回null
		if (size == 0) {
			return null;
		}

		return top.data;
	}

	// 判断是否为空
	public boolean isEmpty() {
		return size == 0;
	}

	// 清空栈
	public void clear() {
		top = null;
		size = 0;
	}

	public String toString() {
		if (size == 0) {
			return "[]";
		}

		else {
			StringBuilder sb = new StringBuilder("[");

			for (Node current = top; current != null; current = current.next) {
				sb.append(current.data.toString() + ", ");
			}

			sb.append("]");

			int length = sb.length();

			return sb.delete(length - 3, length - 1).toString();
		}
	}
}

 

测试代码:

package com.liuhao.test;

import org.junit.Test;

import com.liuhao.DataStructures.LinkStack;

public class LinkStackTest {

	@Test
	public void test() {

		// 以指定第一个元素和底层数组长度的方式构建顺序栈
		LinkStack<String> linkStack = new LinkStack<String>("我");
		System.out.println("当前所含内容" + linkStack);

		// 压入数据元素,元素格式大于了定义栈时底层数组的长度
		linkStack.push("是");
		linkStack.push("liuhao");
		linkStack.push("程序员");
		// 发现是先入后出的方式打印的
		System.out.println("当前所含内容" + linkStack);
		// 获取栈中元素个数
		System.out.println("当前栈中元素个数是:" + linkStack.length());
		// 获取栈顶元素
		System.out.println("当前栈顶元素是:" + linkStack.getTop());

		// 弹出元素
		System.out.println("弹出元素:" + linkStack.pop());
		// 发现是先入后出的方式打印的
		System.out.println("当前所含内容" + linkStack);
		// 获取栈顶元素
		System.out.println("当前栈顶元素是:" + linkStack.getTop());
		// 获取栈中元素个数
		System.out.println("当前栈中元素个数是:" + linkStack.length());

		// 判断是否为空栈
		System.out.println("当前栈是否为空:" + linkStack.isEmpty());
		// 清空栈
		linkStack.clear();
		// 判断是否为空栈
		System.out.println("当前栈是否为空:" + linkStack.isEmpty());
		// 获取栈顶元素,空栈时返回null
		System.out.println("当前栈顶元素是:" + linkStack.getTop());
		// 获取栈中元素个数
		System.out.println("当前栈中元素个数是:" + linkStack.length());

		// 空栈时进行弹出元素
		System.out.println("弹出元素:" + linkStack.pop());
	}

}

 

测试结果:



 

JDK提供的栈:

对于Java集合而言,并没有提供一个Stack接口,再为该接口提供顺序栈、链栈两种实现。

 

实际上提供了一下两种实现方式:

 

  • java.util.Stack:一个普通的顺序栈,底层基于数组实现,同时是线程安全的,可以在多线程环境下放心使用。
  • java.util.LinkedList:之前介绍过,LinkedList是一个双向链表,但是查看该类的API可以发现,它同时也提供了push()、pop()、peek()等方法,这表明LinkedList完全可以当成栈来使用。但是要注意LinkedList不是线程安全的。

 

代码获取地址:https://github.com/liuhao123/JavaMore.git

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈的Java实现--链栈 的相关文章

随机推荐

  • 解决Ubuntu18.04 安装ROS中 sudo rosdep init 和 rosdep update 失败问题

    解决Ubuntu18 04 安装ROS中 sudo rosdep init 和 rosdep update 失败问题 目录 解决Ubuntu18 04 安装ROS中 sudo rosdep init 和 rosdep update 失败问题
  • GD32F303 移植freertos 中断管理设定。。。。

    之前做项目时 xff0c 使用GD32F303并移植了freertos 移植过程网上有很多教程 xff0c 根据这些教程移植就可以 移植完后注意FreeRTOSConfig h中关于RTOS中断管理的设置 我移植时在官网下的是当时最新的RT
  • ros自建功能包操作

    功能包改名 假定功能包原名Apkg xff0c 要改成Bpkg 把Apkg功能包文件夹名改为Bpkg 把CMakeLists txt中project Apkg 改为project Bpkg 把Package xml文件中 lt name g
  • Jacobian矩阵和梯度矩阵

    记号标识 标量 xff1a 常规小写字母 xff1b 向量 xff1a 加粗的小写字母 x 61 x 1
  • 一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!

    本文转自 xff1a https mp weixin qq com s MzmdxqukOZ6rUta9nkGGw 本文来自我的知识星球的球友投稿 xff0c 他在最近的校招中拿到了蚂蚁金服的实习生Offer xff0c 整体思路和面试题目
  • arduino 自平衡小车3\对mpu6050获得的X轴角度和角速度进行卡尔曼滤波

    对mpu6050获得的X轴角度和角速度进行卡尔曼滤波 mpu6050得到的角度值有些值的偏差较大 xff0c 为了使平衡小车更加稳定 xff0c 需要对获得的角度进行优化 xff0c 使用 卡尔曼滤波 xff0c 代码如下 xff1a in
  • nginx CPU 100 跑满问题定位

    1 确定连接数是不是达到了上限 2 确定是不是开启了gzip压缩 xff0c 确定压缩等级 xff0c 小于1kb的不要压缩 xff1b 图片 xff0c 大文件 xff0c 大压缩文件等不要压缩 3 单个CPU占用100 原因的定位 xf
  • 虚拟串口及其在串口转以太网中的应用

    本文介绍虚拟串口的概念 xff0c 以及如何在串口转以太网中利用该技术 1 虚拟串口的概念 虚拟串口是用操作系统的虚拟驱动技术产生的串口 xff08 COM口 xff09 xff0c 相对于计算机本身的硬件串口 xff08 COM1等 xf
  • 机器学习——PCA降维

    参考文章 xff1a https zhuanlan zhihu com p 77151308 PCA xff08 Principal Component Analysis xff09 是一种常见的数据分析方式 xff0c 常用于高维数据的降
  • C++命名规则--简明即查即用版(Windows开发环境)

    目录 前言 1 类名 2 函数名 3 参数 4 变量 5 常量 6 静态变量 7 全局变量 8 类的成员变量 前言 Microsoft推出的命名规则匈牙利法是 在变量和函数名中加入前缀以增进人们对程序的理解 xff0c 但如此一来太为繁琐
  • STM32中的FreeRTOS-#1(入门)

    写在前面 xff1a 我一直觉得 xff0c 如果我能把一点知识说给别人听 xff0c 并且别人能听懂 xff0c 大概率我自己真的学会了 记录的过程也是自己梳理的过程 xff0c 本系列我把它称为 教程 xff0c 是想把它写得系统且有条
  • 信号量 与 互斥量的区别

    原文来源 https blog csdn net ZhipingXi article details 78031307 信号量 与 互斥量 xff08 锁 xff09 的区别 一 概念和定义 信号量 xff1a 多线程同步使用的 xff1b
  • opencv版本问题,引起的vins视觉结果漂移

    最近在根据vins代码进行改写 xff0c 实验发现 当opencv为3 4 12版本时 xff08 core imgproc imgcodecs这几个库 xff09 xff0c vins 优化结果会非常飘 如果vins结果比较离谱 xff
  • i.MX6U SPI浅析

    1 SPI简介 SPI 全称是 SerialPerripheral Interface xff0c 也就是串行外围设备接口 SPI 是 Motorola 公司推出的一种同步串行接口 技术 xff0c 是一种高速 全双工的同步通信总线 xff
  • 【飞控协议】MavLink介绍和编译

    MavLink是什么 xff1f MavLink xff08 Micro Air Vehicle Link xff0c 微型空中飞行器链路通讯协议 xff09 是在串口通讯基础上的一种更高层的开源通讯协议 xff0c 主要应用在无人飞行器与
  • 工作中常用到的设计模式-调用第三方系统接口

    一 概述 外呼业务场景中 xff0c 有一个关键的接口就是黑名单接口 xff08 包括客户投诉 退订接口 是否还款等 xff09 xff0c 我们系统需要经常去跟外部第三方系统交互 xff08 http方式 xff09 一个请求都会经历这几
  • 多旋翼飞行器振动机理分析和减振设计

    多旋翼飞行器振动机理分析和减振设计 开源资源与pdf版论文见 https gitee com robin shaun Multicopter Vibration Attenuation或 https github com robin sha
  • USB3的端口识别Realsense D435i的USB为USB2的解决办法

    如果确定系统没有问题 xff08 识别其他的设备为USB3 xff09 时 xff0c 可参考如下解决方案 xff0c 来自https www intel com content www us en support articles 000
  • XTDrone无人机仿真平台

    XTDrone无人机仿真平台 背景XTDrone展示 背景 近年来 xff0c 无人机的智能化程度不断提高 xff0c 集群的规模不断增大 xff0c 在这种背景下 xff0c 良好的无人机通用仿真平台的重要性越发凸显 相较于无人车和地面机
  • 栈的Java实现--链栈

    栈的Java实现 链栈 链栈 xff0c 顾名思义 xff0c 就是以链表的形式实现的栈的相关操作 xff0c 其实是功能弱化了的链表 xff0c 如果已经阅读过链表的实现代码 xff0c 那么链栈的实现显得更为容易 链栈的基本结构 xff