递归泛型二叉树、List、Set、Map、队列Queue

数据结构——线性表及Set,Map详解 线性表:由n(n>0)个数据元素(数字,字符等)所构成的有限序列,逻辑连续(一条直线),物理上不一定连续,分为顺序表和链表1.顺序表:1.能存储的数据有限(一次开辟,永久使用),但是易于操作、编写代码 2.空间利用率相对高 3.若查改元素,其时间复杂度低O(1),可根据数组下标直接访问; 若增删移其时间复杂度高,至少 O(n),会牵涉到大量元素的整体移动2.链表: 1.能存储的数据取决于堆的内存 阅读详情

一。 二叉树递归泛型版
泛型比较大小转成Comparable调用compareTo

将泛型值t强转Comparabl,调用compareTo用来比较
         public class Treetwo2<T> {
    public class Node<T> {
        private T date;
        private Node<T> lift;
        private Node<T> right;

        private Node(T date) {
            this.date = date;
        }
    }
    private Node root;
    private  void addToNode(Node node,T t){
        if(((Comparable)t).compareTo(node.date)<0){//将泛型值t强转Comparabl,调用compareTo用来比较
            //date加到左边
            if(node.lift==null){//节点左边如果为空把t给左边并return退出
                node.lift=new Node<T>(t);
                return;
            }
            addToNode(node.lift,t);//如果节点左边不空,继续调用本身访问左边下个节点
        }
        else if (((Comparable)t).compareTo(node.date)>0){
            //date右移动
            if(node.right==null){
                node.right=new Node<T>(t);
                return;
            }
            addToNode(node.right,t);
        }
    }
    public void add(T t){
        if(root==null){
            root=new Node(t);
            return;
        }else{
            addToNode(root,t);
        }
    }

    public void trivelNode(Node<T> node){
        if(node.lift!=null){
            trivelNode(node.lift);
        }
        System.out.println(node.date);
        if(node.right!=null){
            trivelNode(node.right);
        }
    }
    public void trivel(){
        trivelNode(root);
    }
}

二。 List
List(I): ArrayList:数组 LinkedList:双向链表 Vector
可使用下标
add(index, E e), remove(index)
get(index), set(index, E e)

1.ArrayList和LinkedList效率比较

public class ArryAndLinked {
    public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList<>();
        LinkedList<String> linkedList=new LinkedList<>();
        for(int i=0;i<1000000;i++){
            arrayList.add("1");
            linkedList.add("1");
        }
        //比较从头部访问的速度
        long time1=System.currentTimeMillis();
        arrayList.get(10);
        long time2=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time2-time1));
        long time3=System.currentTimeMillis();
        linkedList.get(10);
        long time4=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time4-time3));
        //比较从中间访问的速度
        long time5=System.currentTimeMillis();
        arrayList.get(500000);
        long time6=System.currentTimeMillis();
        System.out.println("中部访问速度"+(time6-time5));
        long time7=System.currentTimeMillis();
        linkedList.get(500000);
        long time8=System.currentTimeMillis();
        System.out.println("中部访问速度"+(time8-time7));
        //比较从尾部访问的速度
        long time9=System.currentTimeMillis();
        arrayList.get(980000);
        long time10=System.currentTimeMillis();
        System.out.println("尾部访问速度"+(time10-time9));
        long time11=System.currentTimeMillis();
        linkedList.get(980000);//linkedList是双向链表
        long time12=System.currentTimeMillis();
        System.out.println("尾部访问速度"+(time12-time11));
        System.out.println("----------------------");
        //比较插入速度
        //头部插入速度
        long time01=System.currentTimeMillis();
        arrayList.add(10,"2");//ArryList每插入一个,后面所有都要向后面移
        long time02=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time02-time01));
        long time03=System.currentTimeMillis();
        linkedList.add(10,"2");//链表插入可以在这个位置直接插入,应为其空间位置不是连续的
        long time04=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time04-time03));
        //中部插入
        long time05=System.currentTimeMillis();
        arrayList.add(500000,"2");//ArryList每插入一个,后面所有都要向后面移,所以插入位置越靠后越快
        long time06=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time06-time05));
        long time07=System.currentTimeMillis();
        linkedList.add(500000,"2");
        long time08=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time08-time07));
        //尾巴部插入
        long time09=System.currentTimeMillis();
        arrayList.add(980000,"2");
        long time010=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time010-time09));
        long time011=System.currentTimeMillis();
        linkedList.add(980000,"2");
        long time012=System.currentTimeMillis();
        System.out.println("头部访问速度"+(time012-time011));
    }
}

2.LinkedList独有的方法 - 了解
linkList.addFirst("");
linkList.addLast("");
linkList.removeFirst();
linkList.removeLast();
linkList.getFirst();
linkList.getLast();

三。Set
1. 实现类 HashSet:
HashSet: 散列表/无序的, 不是随机!! 不允许重复元素
add原理: 详见图
remove原理
结论: hashCode和equals要一起重写
注意: equals方法判断相同的两个对象, hashCode方法结果一定要一致
equals判断不相同的两个对象, hashCode结果要尽量不一样

public class Studengt {
    private int age;
    private String name;
    public Studengt(int age,String name){
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString() {
        return  age +
                ", "+name+'\n';
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Studengt studengt = (Studengt) o;
        return age == studengt.age &&
                Objects.equals(name, studengt.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
    加上get/set代码

public class HashCode1 {
    public static void main(String[] args) {
        Set<Studengt>set=new HashSet<>();
        set.add(new Studengt(18,"张三"));
        set.add(new Studengt(18,"张三"));
        set.add(new Studengt(20,"王二"));
        set.add(new Studengt(20,"李久"));
        System.out.println(set);
        System.out.println("----------");
        Studengt s1=new Studengt(18,"张三");
        Studengt s2=new Studengt(30,"六六");
        Studengt s3=new Studengt(18,"离奇");
        Set<Studengt>set1=new HashSet<>();
        set1.add(s1);
        set1.add(s2);
        set1.add(s3);
        System.out.println(set1);
        s1.setAge(22);
        set1.remove(s1);//s1的属性改变之后其哈希码改变导致和之前哈希地址不同,无法找到删除s1
        System.out.println(set1);
    }
}

①判断元素是否相同,是否要add进去:
Student没有重写equals和hashCode, 全部new出来的哈希码不同

重写了equals方法, 但是没有重写hashCode, 全部new出来的哈希码不同

重写了hashCode方法, 但是没有重写equals, new出的元素数组地址相同,但无法比较数组地址下的链表内容

重写了equals和hashCode方法, 能找到数组地址并比较数组地址下的链表内容,相同的就不添加
② 元素属性值发生了改变,用remove移除,移除的时候,重新计算位置,发现位置上找不到s1对象,不会移除。
③ Object中 hashCode() 方法默认得到的是 对象的物理地址
hashCode没有重写, 所有对象的哈希值都不一样
但哈希值不一样, 定位到的set中的位置, 可能相同

2 . SortedSet(I)接口
|- 实现类TreeSet: Comparable Comparator
特点: 不允许重复, 和equals方法无关
取决于 compare 或者 compareTo 方法

public class TreeSet1 {
    public static void main(String[] args) {
    // 可以通过构造方法, 传入比较器
        Set<String>set=new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {//相同就不会输出
                return o1.length()-o2.length();
            }
        });
        set.add("aaa");
        set.add("bbbb");
        set.add("gg");
        set.add("oooop");
        System.out.println(set);
        System.out.println("_____________");
        Set<Studengt>set1=new TreeSet<>(new Comparator<Studengt>() {
            @Override
            public int compare(Studengt o1, Studengt o2) {
                return o1.getAge()-o2.getAge();
            }
        });
        set1.add(new Studengt(18,"李四"));
        set1.add(new Studengt(18,"王五"));
        set1.add(new Studengt(20,"李四"));
        System.out.println(set1);
        System.out.println("______________");
        Set<Integer>set2=new TreeSet<>();//没重写Compalable也会用默认方法排序
        set2.add(1);
        set2.add(2);
        set2.add(3);
        set2.add(3);
        set2.add(7);
        set2.add(5);
        System.out.println(set2);
    }
}

四。Map
Map(I): 映射表 key->value, 通过key 获得value
Map中的key, 单独的一部分, 就是Set
|- HashMap
|- TreeMap
1.HashMap
常用API:
V put(key, value)
V remove(key)
V get(key)
containsKey containsValue isEmpty size…
putAll

public class Map1 {
    public static void main(String[] args) {
        Map<Integer,String>map=new HashMap<>();
        //1添加.put的返回值:对应key之前的value内容
        map.put(1,"黑土");
        map.put(4,"黑龙江");
        map.put(3,"铁岭");
        map.put(2,"白云");
        //会自动用默认的hashcode排序
        System.out.println(map);
        //2移除。remove返回值:被移除前的value 
        map.remove(1);
        String m=map.remove(3);
        System.out.println("remove返回值"+m);
        System.out.println(map);
        //3修改集合中的元素
        String s=map.put(2,"乌云");
        map.put(5,"老树");
        System.out.println("put返回值"+s);//put的返回值:对应key之前的value内容
        System.out.println(map);
        //4获得get  返回值value
        System.out.println(map.get(2));
    }
}

2.迭代Map对应的三个方法
entrySet()
keySet()
values()

public class MapTrivel {
    public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        map.put("黑土","11236");
        map.put("白云","7764");
        map.put("简自豪","7764");
        map.put("郭德纲","7764");
        //①获取所有的键,成键集
        Set<String>keys=map.keySet();
        //遍历键集
        for(String ke:keys){
            //ke为键。然后获取对应value
            String value=map.get(ke);
            System.out.println(ke+"="+value);
        }
        System.out.println("------------");

        //②获取所有entry对象。键值对
        Set<Entry<String,String>> entrySet=map.entrySet();//如果没导包Entry写成Map.Entry
        //遍历得到的每一个entry对象
        for(Entry<String,String>entry:entrySet){
            //将键值对分解
            String key=entry.getKey();//获取key
            String value=entry.getValue();//获取value
            System.out.println(key+"="+value);
        }
        System.out.println("-------------");

        //③只能遍历value
        Collection<String>value=map.values();
        for(String va:value){
            System.out.println(va);
        }
    }
}

3.判断字符串中各字符出现的个数

public class Exice {//判断字符出现的次数
    public static void main(String[] args) {
        Scanner consol=new Scanner(System.in);
        String str=consol.next();
        //将字符转为字符数组
        char[] arr=str.toCharArray();

        Map<Character,Integer>map=new HashMap<>();
        //遍历数组进行统计
        for(Character c:arr){
            //判断是否首次出现
            Integer ori=map.get(c);
            if(ori==null){
                ori=0;
            }
          map.put(c,ori+1);
        }
        System.out.println(map);
    }

五。队列Queue
Queue(I): - 队列(offer/poll/peek)
|- Deque(I) - 双端队列(offerFirst/offerLast…)
- 栈(push/pop)
|- LinkedList
1。单向队列Queue

public class Demo01Queue {
    public static void main(String[] args) {
        // 1.创建队列 - 先进先出
        Queue<String> qu = new LinkedList<>();
        // 2.进队列的方法
        qu.offer("哈哈哈");
        qu.offer("嘻嘻嘻");
        System.out.println(qu);
        // 3.获取队列头元素的方法
        String s1 = qu.peek(); // -- 只是查看访问
        System.out.println("队列头: " + s1);
        System.out.println("队列: " + qu);
        s1 = qu.poll(); // -- 获取队列头元素,并将元素从队列中移除
        System.out.println("队列头2: " + s1);
        System.out.println("队列2: " + qu);
    }
}

2.双向队列Deque

public class Demo02Deque {
    public static void main(String[] args) {
        // 1.创建一个双端队列的方法
        Deque<String> dq = new LinkedList<>();
        // 2.拥有队列相关的所有方法 offer peek poll
        dq.offer("哈哈哈");
        dq.offer("嘻嘻嘻");
        // 3.可以从队列头和尾加元素
        dq.offerFirst("hahaha");
        dq.offerLast("heihei"); // 等同于offer方法
        System.out.println(dq);
        // 4.可以从队列头和尾取元素
        String s1 = dq.pollFirst(); // 等同于poll
        System.out.println("队列头: " + s1);
        System.out.println("队列: " + dq);

        s1 = dq.pollLast();
        System.out.println("队列尾: " + s1);
        System.out.println("队列: " + dq);
    }
}
public class Demo03Stack {
    public static void main(String[] args) {
        // Deque当你使用它的 push 和 pop 方法时, 他就变成了栈
        // 链表栈
        Deque<String> stack = new LinkedList<>();
        stack.push("a");
        stack.push("b");
        stack.push("c");
        System.out.println(stack);
        String s = stack.pop();
        System.out.println("栈顶元素: " + s);
        System.out.println("栈: " + stack);

        // 栈: 数组栈
        Stack<String> stack2 = new Stack<>();
        stack2.push("h");
        stack2.push("i");
        System.out.println(stack2);

        String s2 = stack2.pop();
        System.out.println("stack2的栈顶: " + s2);
    }
}
LEC/FORMAL --- PARTIII debug lec(logic equivalence checking)又叫formal check,是对ic design的综合,PR前后的设计进行逻辑对比检查的工具/手段,保证综合不改变rtl原始的logic function。目前用的较多的就是C家的formal工具。接下来介绍一下lec过程中遇到的问题以及debug手段。... 阅读详情

相关推荐

Agent + 监控平台:自动诊断告警根因

根因分析、智能监控、AI Agent、告警风暴、异常检测、可观测性、故障诊断在现代分布式系统中,快速定位和解决问题是维持系统稳定性的关键。传统的监控系统虽然能够生成大量告警,但往往缺乏对告警根因的自动诊断能力,导致运维团队在告警风暴中难以快速定位问题。本文深入探讨了将AI Agent技术与监控平台结合,实现告警根因自动诊断的技术架构、理论基础和实现方法。我们将从第一性原理出发,分析根因诊断问题的本质,介绍基于Agent的智能监控系统设计,并通过实际案例展示其应用价值。文章同时涵盖了从理论到实践的全链路,包括

AIGC应用创新大全的博客 304

java 递归泛型_递归与泛型

递归的本质是将一个大问题分解为一个简单的小问题然后逐步推进,比如说将1234打印出4,3,2,1的顺序,那么本质上就是n%10,可以将1234分解不断除以十,得到四个 个位数。递归法则:1、基准,即有穷,最终至少有一个情形是已知的,比如说第一个数或者最后一个数是可以得知的。2、不断推进,能不断嵌套执行靠近基准。3、递归的方法中不要做重复性的工作。/*** @author wulei* 递归测试*/...

weixin_39663360的博客 423

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

Yilu264的博客 1万+

设计模式-建造者模式(具有递归类型参数的泛型类型)

Effective-Java - 建造者模式 - 具有递归类型参数的泛型类型

weixin_63800030的博客 716

美亚杯2023参赛全攻略:从检材下载到Veracrypt挂载的保姆级教程

本文提供美亚杯2023电子数据取证竞赛的完整参赛指南,重点解析从检材下载、Veracrypt挂载到实战取证的保姆级流程。针对新手常见误区,详细说明两套密码(ZIP解压密码与Veracrypt挂载密码)的区别与正确使用方法,并分享赛前环境搭建、赛中高效分析及赛后报告撰写的核心技巧,帮助参赛者系统备赛,规避基础错误。

y9z0a1b的博客 1079

grafana使用方法

1、点击仪表盘2、新建仪表盘3、选择数据源4、选择查询的条件5、美化。

2403_87359664的博客 323

java 集合递归_集合的嵌套(泛型)和递归算法

1、  集合的嵌套:集合的用法其实和数组的用法有很多共同之处,在使用数组的时候,二维数组就是数组的嵌套;那么在集合之中是否也可以这样呢?当然也是可以的,例如对于最复杂的的map集合;map>;这样map中就嵌套了一个map集合;其中对于map右边的<>尖括号是泛型的一种应用;a、泛型使用尖括号里面规定存入的类型,简单来说就是对于存入数据的一种限制,和数组比较像,只能够存入一种数据...

weixin_35990358的博客 1169

使用ClickHouse JDBC官方驱动,踩坑无数

这个问题我在网上查原因说是由于Zookeeper压力过大,表变成只读状态,导致ClickHouse插入数据失败。写入数据频率过高。Zookeeper中的集群节点挂掉。而我们项目出现这个问题的原因是第一个:写入数据频率过高。但是在网上搜资料的过程中,我又发现了另外一个问题:我们项目用了JDBC驱动,但ClickHouse官方并不推荐。。证实了官网确实不建议使用驱动:而应该改成驱动,并且推荐使用0.3.2以上的版本:于是,后面几天开始了ClickHouse的JDBC驱动升级之旅。

2万+

java 递归泛型_java – 递归泛型

有没有办法使这个方法适当通用并取消警告?/*** Sort a collection by a certain "value" in its entries. This value is retrieved using* the given valueFunction which takes an entry as argument and returns* its value.** Exampl...

weixin_39953673的博客 309

化工设计软件:AutoCAD Plant 3D二次开发_(1).AutoCADPlant3D概述

AutoCAD Plant 3D 是一款专为化工行业设计的三维工厂设计和建模软件。它基于AutoCAD平台,提供了强大的三维建模功能和专业的化工设计工具,帮助工程师和设计师在工厂设计过程中提高效率和准确性。AutoCAD Plant 3D不仅能够创建详细的三维模型,还可以进行管道设计、设备布置、支架设计等复杂任务。通过上述案例,我们可以看出 AutoCAD Plant 3D 在化工厂设计中的强大功能和优势。该软件不仅提供了丰富的建模工具和专业的设计功能,还支持二次开发,使用户能够根据具体需求进行定制化操作。

kkchenjj的博客 1104

85-Halcon-- gen_cam_par_area_scan_division 函数功能(生成面阵相机镜头参数)

Halcon的gen_cam_par_area_scan_division算子用于生成面阵相机的镜头参数,支持除法畸变模型。该算子输出包含9个参数的元组,包括焦距(Focus)、畸变系数(Kappa)、像素尺寸(Sx,Sy)、主点坐标(Cx,Cy)和图像尺寸。文中详细解析了各参数含义、数学原理(包括畸变矫正公式和坐标转换),并提供了三个工业应用案例:高精度芯片尺寸测量、机器人焊接引导和大视野汽车表面检测。最后给出了完整的相机标定流程,涵盖参数生成、畸变校正和标定配置步骤,适用于工业视觉系统的精确标定需求。

weixin_45590420的博客 915

【沉浸式解决问题】基于泛型递归,Java中实体类基类开启MybatisPlus的ActiveRecord模式

MybatisPlus的ActiveRecord模式对本地数据处理项目十分的便捷,同时为了更好的管理公共字段,又引入了BaseEntity作为基类,包括创建时间、创建者、更新时间、更新者等字段,之后所有的实体类再继承基类,但是这样实体类就无法再使用MybatisPlus的Model类提供的数据库操作方法了,想到了通过泛型递归来解决。

AlienProgrammer的博客 1089

6、掌握 CorelDRAW:从基础操作到创意绘图

本文详细介绍了CorelDRAW的基础操作与创意绘图技巧,涵盖软件使用注意事项、常用快捷键、全局与局部设置的区别、Dockers面板的高效使用,并通过绘制带星星图案的球实例,逐步演示了对象创建、编辑、复制、分布优化、元素添加、颜色与特效调整等核心功能,最后讲解了作品的保存与输出方法,帮助用户从入门到进阶掌握CorelDRAW的设计流程。

snow3的博客 122

Java基础九之Java的集合框架简单介绍

数据结构------这个查看考研的笔记吧 线性表 顺序表 链表-----简单实现一个链表,并能增删改节点 栈-------栈满栈空 出栈入栈 队列-----队满队空 出队入队 树 二叉树------遍历 、增删改 图 hash表 用于在大量的数据中快速定位到某个特定的数据。通常存放数据包含两部分:关键字key 作为存储和检索的索引,数据Data存放实际数据项 哈希函数:确定...

ZHWVICDI的博客 267

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

算法-二叉树

算法-二叉树

lgy_lucky的博客 1203

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++进阶(04):map和set

本文核心要点包括:1)set存储唯一值且不可修改;2)map存储键值对,key唯一不可修改,value可修改;3)两者操作时间复杂度均为O(logn)。与哈希表相比,map/set保持有序性但查找稍慢;与AVL树相比,红黑树旋转操作更少。典型应用场景包括set实现数组去重和map统计字符出现次数。

2401_86650143的博客 844

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

CPT102数据结构部分

西浦CPT102个人课程笔记

sanmusen_wu的博客 4738

面试季,覆盖70%-80%的面经基础题(java及安卓)-------数据结构与算法篇

数据结构 队列 Queue 什么是队列 队列的种类 Java 集合框架中的队列 Queue Set 什么是 Set 补充:有序集合与无序集合说明 HashSet 和 TreeSet 底层数据结构 List 什么是List List的常见实现类 树 1. 二叉树 2. 堆 3. 二叉查找树(BST) 4. 红黑树 5. B树家族 B树 B+树: B*树: 图 算法 贪心 背包问题 递归法 记忆化搜索 活动选择问题 二叉树遍历 广度优先遍历(BFS) 深度优.

qq_43107850的博客 1802

C++泛型--模版--全解析-- 草履虫也能看懂!

C++模板全解析:泛型编程的核心机制 摘要:C++模板是泛型编程的核心,通过将类型/常量作为参数传递给函数/类,实现代码复用和类型安全。主要分为函数模板和类模板,支持特化、偏特化、可变参数等高级特性。函数模板可自动推导类型参数,类模板需显式实例化。模板特化(全特化和偏特化)允许为特定类型定制实现。可变参数模板支持任意数量参数。非类型模板参数可传入常量值。模板广泛应用于STL容器、算法等场景,是编写高效通用代码的关键。需注意模板的编译模型、代码膨胀等问题。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 750

C++ 核心数据结构 & 基础概念(一)

C++核心数据结构与基础概念摘要 核心要点 时间复杂度:衡量算法效率的关键指标,重点关注大O表示法中的最高阶项,常见有O(1)、O(log n)、O(n)等。 内存管理: 栈内存:自动管理、速度快、容量小,存储局部变量 堆内存:手动管理、容量大、速度慢,存储动态分配对象 核心数据结构: 数组:连续内存,随机访问O(1),vector支持动态扩容 栈/队列:LIFO/FIFO结构,适配器模式实现 链表:非连续存储,增删O(1),查找O(n) 堆(优先队列):完全二叉树实现,快速获取最值 树结构:红黑树保持平衡

luzongbaqi的博客 343

C语言数据结构实战:从链表到二叉树,手把手实现与调试指南

数据结构是计算机科学中组织与管理数据的核心框架,它定义了数据元素之间的逻辑关系与存储方式,是算法高效运行的基础。其原理在于通过特定的结构(如线性、树形)来优化数据的增删改查操作,从而提升程序性能。掌握数据结构对于深入理解内存管理、培养工程化思维至关重要,尤其在系统编程和性能敏感场景中价值显著。本文聚焦于C语言环境下的数据结构工程实践,通过具体的链表、栈、队列和二叉树实现案例,详细解析了指针操作、内存管理以及递归等关键技术的应用,并提供了针对内存泄漏、指针错误等常见问题的调试技巧,旨在帮助学习者跨越理论到实践

weixin_30905133的博客 406

JAVA集合框架(详解HashMap原理)

什么是集合框架? 用于存储数据的容器的统称,存在很多不同的容器,每一种容器根据底层储存数据的结构不一样,使用的场景也不一样. 集合框架图 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue(Queue是Ja...

miroCyber的博客 440

java复习第4天---4.1---集合---数据结构和集合框架结构

java复习第4天---4.1---集合---数据结构和集合框架结构 目录 文章目录1、数据结构1.1、 数组1.2、 链表1.3、 栈1.4、队列1.5、树1.6、 散列表1.7、 堆1.8、 图2、集合框架2.1、 Collection接口2.1.1、List2.1.2、Set2.1.3、Queue2.1.4、Iterable2.2、 Map接口3、总结4、参考文章列表***后记*** : 内容 1、数据结构   程序 = 数据 + 算法 。其中数据设计数据类型及数据的组织存储,既数据结构。这

gaogzhen的博客 244

二叉树算法精讲:高频面试题与实战技巧

二叉树是计算机科学中最基础的数据结构之一,广泛应用于算法设计、数据库索引和文件系统等领域。其核心原理是通过节点和指针构建层次结构,支持高效的查找、插入和删除操作。在工程实践中,二叉树算法能显著提升数据处理效率,特别是在处理层级关系数据时。常见的应用场景包括搜索引擎的索引构建、游戏AI的决策树以及编译器的语法分析等。本文聚焦二叉树高频面试题,深入解析相同树判断、子树检测、翻转二叉树等经典问题,提供Java代码实现和复杂度分析,帮助开发者掌握递归与迭代两种解题范式,提升算法实战能力。

weixin_30706691的博客 373

c++蓝桥杯题目积累

P1055 [NOIP 2008 普及组] ISBN 号码 - 洛谷

2401_86043214的博客 241

二叉树进阶:从递归到迭代、BFS、BST与动态规划的工程实践

二叉树是数据结构与算法中的核心概念,它以节点和边的层次化结构高效组织数据。其工作原理基于递归定义,每个节点最多有两个子节点,这种结构天然适合通过递归进行遍历和操作。从递归到迭代的转变,不仅是实现方式的优化,更是对栈空间管理和程序稳定性的深入理解,对于处理海量数据或深度未知的树结构至关重要。在技术价值上,掌握二叉树的多种遍历方式(如前序、中序、后序的迭代法)和广度优先搜索(BFS),是解决路径查找、层次分析等复杂问题的基础。其应用场景广泛,从数据库索引(如B树、B+树)到文件系统组织,再到编译器语法分析,都离

congdi7904的博客 331
上一篇: 二叉树、Collections的比较器工具、迭代
下一篇: 错误、异常/线程/Map
LDRaaa
博客等级 码龄6年 0粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值