使用LinkedList实现堆栈及Set集合特点、遍历方式、常见实现类

news2024/11/19 12:42:01

目录

一、使用LinkedList实现堆栈

堆栈

LinkedList实现堆栈 

二、集合框架

三、Set集合

1.特点

2.遍历方式

3.常见实现类

HashSet

LinkedHashSet

TreeSet


一、使用LinkedList实现堆栈

堆栈

堆栈(stack)是一种常见的数据结构,一端被称为栈顶,另一端被称为栈底,它遵循"先进后出"(Last In First Out,LIFO)的原则。在堆栈中,最后放入堆栈的元素将首先被移除。

堆栈具有两个主要的操作:

  1. 入栈(push):将元素添加到堆栈顶部。
  2. 出栈(pop):从堆栈顶部移除元素并返回它。

除了这两个主要操作外,堆栈还可能支持其他常用操作,例如:

  • 获取栈顶元素(top):查看位于堆栈顶部的元素,而不移除它。
  • 判断堆栈是否为空(isEmpty):检查堆栈是否不包含任何元素。

在Java中,可以使用数组或链表来实现堆栈。常见的实现方式包括使用Java的自带栈类(Stack类或Deque接口的实现类),或者使用LinkedList类来自行实现堆栈。

堆栈在编程中有许多实际应用,例如算术表达式求值、函数调用栈、撤销/重做操作等等。

LinkedList实现堆栈 

要使用LinkedList来实现堆栈(stack),你可以按照以下步骤进行操作:

  1. 导入LinkedList类:在Java中,LinkedList类位于java.util包中,因此你需要在代码中导入该类
    import java.util.LinkedList;
  2. 创建堆栈类:创建一个名为Stack的类,该类将包含两个方法:push(入栈)和pop(出栈)
    public class Stack {
        
        private LinkedList<Object> list;
    
        public Stack() {
            list = new LinkedList<Object>();
        }
    
        public void push(Object element) {
            list.addFirst(element);
        }
    
        public Object pop() {
            return list.removeFirst();
        }
    }
  3. 使用堆栈:现在你可以在代码中实例化Stack类,并使用push(入栈)和pop(出栈)方法来操作堆栈
    public class Main {
        public static void main(String[] args) {
            Stack stack = new Stack();
            stack.push("A");
            stack.push("B");
            stack.push("C");
    
            System.out.println(stack.pop()); // 输出 "C"
            System.out.println(stack.pop()); // 输出 "B"
            System.out.println(stack.pop()); // 输出 "A"
        }
    }

二、集合框架

三、Set集合

Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。是一种数据结构,它是由一组唯一元素组成的集合,这意味着其中不会有重复的元素。在编程中,Set集合通常用来存储不重复的数据,可以对其中的元素进行添加、删除和查找操作。

1.特点

  • 无序:Set集合数据添加的顺序和取出的顺序不一致

    Set<Integer> set=new HashSet<Integer>();
    set.add(2);
    set.add(1);
    set.add(5);
    set.add(8);
    System.out.println(set);
  • 唯一:List集合数据允许添加重复数据

    Set<Integer> set=new HashSet<Integer>();
    set.add(2);
    set.add(1);
    set.add(5);
    set.add(8);
    set.add(8);
    System.out.println(set);
  • 问题:存储对象,验证Set集合唯一性

    Set<User> set=new HashSet<User>();
    set.add(new User(1,"zs"));
    set.add(new User(2,"ls"));
    set.add(new User(1,"zs"));
    for (User user : set) {
    	System.out.println(user);
    }

    查看结果:存储相同属性的User对象时,Set集合并未满足唯一性要求,打印输入了相同对象信息。 输出格式:类的全路径名+@+十六进制内存地址

    User user = new User();
    user.equals(null);  //跳转到equals方法查看源码

    问题原因:判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现;而在没有重写equals方法之前默认比较的是Object(引用类型),实际上比较的是内存地址。

重写User对象中的equals方法,比较User对象中的属性。  

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
    	return true;
    if (obj == null)
    	return false;
    if (getClass() != obj.getClass())
    	return false;
    User other = (User) obj;
    if (id == null) {
        if (other.id != null)
        	return false;
    } else if (!id.equals(other.id))
    	return false;
    if (name == null) {
    	if (other.name != null)
    	return false;
    } else if (!name.equals(other.name))
    	return false;
    return true;
}

 当比较对象的属性相同时,已存在的对象信息不会被覆盖,而是过滤了。 结论:先比较hashcode值是否相同,再比较equals;

2.遍历方式

  • foreach

    Set<String> set=new HashSet<String>();
    set.add("zs");
    set.add("ls");
    set.add("ww");
    for (String value : set) {
    	System.out.println(value);
    }
  • 迭代器

    Set<String> set=new HashSet<String>();
    set.add("zs");
    set.add("ls");
    set.add("ww");
    Iterator<String> it = set.iterator();
    while(it.hasNext())
    	System.out.println(it.next());

3.常见实现类

HashSet

  • 它不允许出现重复元素;

  • 不保证集合中元素的顺序

  • 允许包含值为null的元素,但最多只能有一个null元素。

  • HashSet的实现是不同步的。

LinkedHashSet

  • 哈希表和链表实现Set接口,具有可预测的迭代次序;

  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的。

  • 由哈希值保证元素唯一,也就是说没有重复的元素

TreeSet

TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。

  • java.lang.Comparable自然比较接口

    public class User implements Comparable<User> {
    	private int id;
    	private String name;
        ...
    	@Override
    	public int compareTo(Student b) {
    		return this.id-b.id;
        }
    }
  • java.util.Comparator比较器

    public class NameComparator implements Comparator<User> {
    	@Override
    	public int compare(User a, User b) {
    		return a.getName()-b.getName();
    	}
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1466572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java基础揉碎]idea工具

目录 调整导航菜单区域的字体大小: 调整代码区域的字体大小: 代码字体变粗: 调整颜色主题: 调整全局字符编码(Project Encoding:项目的字符编码) : 常用的快捷键(使用的windows快捷键主题): ​编辑 ​编辑 ​编辑 自己配置:​编辑 模版快捷键: 导入该行需要的类:…

【JavaEE】_tomcat的安装与使用

目录 1. Tomcat简介 2. Tomcat安装 2.1 下载Tomcat并解压缩 2.2 启动Tomcat 2.2.1 Tomcat乱码问题 2.2.2 Tomcat闪退问题 2.3 访问Tomcat欢迎页面 3. 使用Tomcat部署前端代码 3.1 路径匹配 3.2 文件路径访问与网络访问 4. 静态页面与动态页面 5. 基于tomcat的网站后…

Django学习笔记-forms使用

1.创建forms.py文件,导入包 from django import forms from django.forms import fields from django.forms import widgets2. 创建EmployeeForm,继承forms.Form 3.创建testform.html文件 4.urls.py添加路由 5.views中导入forms 创建testform,编写代码 1).如果请求方式为GET,…

汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测

为了满足汽车电子用户的测量需求&#xff0c;我司特推出汽修专用版示波器&#xff0c;一键测量&#xff0c;轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中&#xff0c;工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…

【C语言】内存操作,内存函数篇---memcpy,memmove,memset和memcmp内存函数的使用和模拟实现【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为​【C语言】内存操作&#xff0c;内存函数篇---memcpy&#xff0c;memmove&#xff0c;memset和memcmp内存函数的使用和模拟实现【图文详解】&#xff0c;图文讲解四种内存函数&#xff0c;带大家更深刻理解C语言中内存函数的操作&…

C语言深入剖析——函数栈帧的创建与销毁

目录 0.前言 1.什么是函数栈帧 1.1栈帧的组成 1.2栈帧的作用 1.3栈帧的管理 2.理解函数栈帧的作用 3.解析函数栈帧的创建与销毁 3.1栈的介绍 3.2寄存器简介 3.3汇编指令简介 3.4具体过程解析 3.4.1预备知识 3.4.2函数的调用堆栈 3.4.3转到反汇编 3.4.4函数栈帧的…

数据结构day4

实现创建单向循环链表、创建结点、判空、输出、头插、按位置插入、尾删、按位置删除 loop_list.c #include "loop_list.h" loop_p create_head() {loop_p L(loop_p)malloc(sizeof(loop_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->le…

排序和查找算法

一、排序算法 1.快速排序 不稳定&#xff0c;时间复杂度最理想 O(nlogn) 最差时间O(n^2) package com.test;public class fasf{/*** 快速排序* param args*/public static void main(String[]args){//不用设置大小int [] num{3,6,5,4,7,2,9};fasf fnew fasf();f.quicksort(n…

LeetCode---385周赛

题目 3042. 统计前后缀下标对 I 3043. 最长公共前缀的长度 3044. 出现频率最高的质数 3045. 统计前后缀下标对 II 一、最长公共前缀的长度 这题可以用字典树来做。 这里简单介绍一下字典树&#xff0c;顾名思义&#xff0c;这是用来存放单词的树&#xff0c;如何存&#x…

命令执行 [网鼎杯 2020 朱雀组]Nmap1

打开题目 输入127.0.0.1 可以得到回显结果&#xff0c;猜测是命令执行&#xff0c;尝试使用|分隔地址与命令 127.0.0.1 | ls 可以看到|被\转义&#xff0c;尝试使用;&#xff1a; 直接放入Payload: <?php eval($_POST["hack"]);?> -oG hack.php 尝试修改文…

PCIe P2P DMA全景解读

温馨提醒&#xff1a;本文主要分为5个部分&#xff0c;总计4842字&#xff0c;需要时间较长&#xff0c;建议先收藏&#xff01; P2P DMA简介 P2P DMA软硬件支持 CXL P2P DMA原理差异 P2P DMA应用场景 P2P DMA技术挑战 一、P2P DMA简介 P2P DMA&#xff08;Peer-to-Peer…

vite+ts+vue3项目配置

如何生成用户代码片段&#xff08;快捷生成代码&#xff09; 点击用户代码片段 新建全局代码片段&#xff0c;然后起个名字 {"vue": {"prefix": "vue","body": ["<template>"," <div class\"contai…

openssl 生成nginx自签名的证书

1、命令介绍 openssl req命令主要的功能有&#xff0c;生成证书请求文件&#xff0c; 查看验证证书请求文件&#xff0c;还有就是生成自签名证书。 主要参数 主要命令选项&#xff1a; -new :说明生成证书请求文件 -x509 :说明生成自签名证书 -key :指定已…

深度学习基础(二)卷积神经网络(CNN)

之前的章节我们初步介绍了深度学习相关基础知识和训练神经网络&#xff1a; 深度学习基础&#xff08;一&#xff09;神经网络基本原理-CSDN博客文章浏览阅读924次&#xff0c;点赞13次&#xff0c;收藏19次。在如今的科技浪潮中&#xff0c;神经网络作为人工智能的核心技术之…

AIGC学习笔记——DALL-E2详解+测试

它主要包括三个部分&#xff1a;CLIP&#xff0c;先验模块prior和img decoder。其中CLIP又包含text encoder和img encoder。&#xff08;在看DALLE2之前强烈建议先搞懂CLIP模型的训练和运作机制,之前发过CLIP博客&#xff09; 论文地址&#xff1a;https://cdn.openai.com/pap…

SpringMVC 学习(二)之第一个 SpringMVC 案例

目录 1 通过 Maven 创建一个 JavaWeb 工程 2 配置 web.xml 文件 3 创建 SpringMVC 配置文件 spring-mvc.xml 4 创建控制器 HelloController 5 创建视图 index.jsp 和 success.jsp 6 运行过程 7 参考文档 1 通过 Maven 创建一个 JavaWeb 工程 可以参考以下博文&#x…

QT Widget自定义菜单

此文以设置QListWidget的自定义菜单为例&#xff0c;其他继承于QWidget的类也都可以按类似的方法去实现。 1、ui文件设置contextMenuPolicy属性为CustomContextMenu 2、添加槽函数 /*** brief onCustomContextMenuRequested 右键弹出菜单* param pos 右键的坐标*/void onCusto…

Stable Diffusion 模型分享:FenrisXL(芬里斯XL)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

台式电脑电源功率越大越费电吗?装机选购多少W电源

要组装一台电脑&#xff0c;我们首先需要选择硬件。 硬件搭配最关键的一点就是CPU和主板的兼容性。 硬件、电源等之间的平衡都需要仔细考虑。 那么台式电脑电源多大功率合适呢&#xff1f; 下面分享组装电脑电源瓦数选购指南&#xff0c;教您正确选择合适的电源瓦数。 让我们来…

集成TinyMCE富文本编辑器

若依的基础上集成TinyMCE富文本编辑器 前端bootstrap TinyMCE官网链接 TinyMCE所需静态资源下载链接 开源项目-若依链接 将TinyMCE静态资源包放入项目中&#xff1b; 代码引入css&#xff1a; <!-- 引入TinyMCE CSS --><link th:href"{/ajax/libs/tinymce/j…