数据结构

前言

数据结构是程序员的基本功,程序 = 数据结构 + 算法 此章节是自己的学习记录


一、数据结构介绍

c 复制代码
   是为实现对计算机数据的各种操作,不同的数据结构有自己的使用场景,
目的是为了降低时间复杂度以及空间复杂度,一般都是以空间换时间,
提高程序的速度。

二、数据结构划分

c 复制代码
   1. 数据存储:数据存储的底层都是通过 <数组> 和 <链表> 来存储
   2. 数据结构划分: 根据物理逻辑可以分为 <线性结构> 以及 <非线性结构>
a)线性结构有:「数组」、「链表」、「栈」、「队列」、
b)非线性结构有:「树」、「图」、「字典」、「堆」。

如图所示:PS这张图是引用了《图解算法数据结构》,这本书很棒,通过微信公众号《程序员鱼皮》了解到的,要是有侵权给我留言,我删除图片,没有用于商用就是用于兴趣学习,以后用的图也大部分是从其他地方,不喜勿喷,菜鸟学习记录中。 本节将使用C#语言中各数据结构的初始化与构建方法来介绍各数据结构的基本特点

  1. 数组 array: 数组是一个存储相同类型元素的集合,存储在计算机一块连续的内存空间,通过下标访问数据。 a)查找就是计算偏移量来查找其他的值所以 ==时间复杂度是:O(1)== b)增、删、改的操作会对移动原来的元素所以 ==时间复杂度是:O(n)==
c# 复制代码
// 初始化一个长度为 5 的数组 array
int[] array = new int[5];
// 元素赋值
array[0] = 2;
array[1] = 3;
array[2] = 1;
array[3] = 0;
// 直接赋值的初始化方式
int[] array = {2, 3, 1, 0, 2};

「List数组」是经常使用的数据结构,相比普通数组更加灵活。常用操作有:访问元素、添加元素、删除元素。

csharp 复制代码
// C#初始化可变数组List
List<int> array = new List<int>();

// 向尾部添加元素
array.Add(2);
array.Add(3);
array.Add(1);
array.Add(0);
array.Add(2);
  1. 链表 ListNode: 链表存储在计算机一块不连续 的内存空间,ListNode就是节点对象 val是==存储数据元素==的值,next是存储==下一个结点地址==的指针。
c# 复制代码
// 定义一个链表
public class ListNode {
     public int val;
     public ListNode next;     
     public ListNode(int val=0,ListNode next=null) 
     {
         this.val = val;
         this.next = next;
     }
 }
  1. 栈 stack: ==栈是有顺序的==,在一片连续的内存,特性就是先进后出,由系统自动分配和维护,可以通过==数组或者链表==实现。
c# 复制代码
// 初始化一个栈
Stack st = new Stack();
c# 复制代码
// 通过数组定义一个栈
public class CustomStack {
    int[] stack;
    int top;
    public CustomStack(int maxSize) {
        stack = new int[maxSize];
        top =-1;
    }
    public void Push(int x) {
        if(top!=stack.Length-1)
        {
            top++;
            stack[top]=x;
        }
    }
    public int Pop() {
        if(top==-1)
        {
            return -1;
        }
        --top;
        return stack[top + 1];
    }
}

常用操作==入栈 push()==,==「出栈 pop()==,展示了栈的先进后出特性。

c# 复制代码
// 初始化一个栈
st.Push('1');  //元素1入栈
st.Push('2');  //元素2入栈
st.pop();      //元素2出栈 
st.pop();      //元素1出栈
  1. 队列 queue : ==队列也是有顺序的==,特性就是先进后出,可使用数组和链表实现。
c# 复制代码
// 初始化一个队列
Queue q = new Queue();

常用操作==入队 push()==,==「出队 pop()==,展示了栈的先进先出特性。

csharp 复制代码
q.Enqueue(1);  //元素1入栈
q.Enqueue(2);  //元素2入栈
q.Dequeue();  //元素1出队  
q.Dequeue();  //元素2出队
  1. 树 TreeNode: 树定义:包含满二叉树、完全二叉树、搜索二叉树、平衡搜索二叉树 树存储:数组和链表存储,一般推荐链表 树的遍历方式:深度优先DFS 和广度优先BFS 深度优先包括前序遍历 两种遍历方式递归迭代 ListNode就是节点对象 ==val==是==存储数据元素==的值,==left==是存储数据元素的==左边指针====right==是存储数据元素的==右边指针==。
c# 复制代码
// 定义一个树
public class TreeNode {
      public int val;
      public TreeNode left;
      public TreeNode right;
      public TreeNode(int val=0, TreeNode left=null, 
      TreeNode right=null) 
      {
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }
csharp 复制代码
// 初始化节点
TreeNode n1 = new TreeNode(3); // 根节点 root
TreeNode n2 = new TreeNode(4);
TreeNode n3 = new TreeNode(5);
TreeNode n4 = new TreeNode(1);
TreeNode n5 = new TreeNode(2);

// 构建引用指向
n1.left = n2;
n1.right = n3;
n2.left = n4;
n2.right = n5;
  1. 字典 Dictionary : Dictionary和hashtable是一个==键值对Key Value==的集合, 选择: a)字典的Key要是整型速度优于哈希表 b)字典不需要装箱插箱,速度优于哈希表 c)多线程字典非线程安全得lock判断会影响速度
csharp 复制代码
// 初始化一个Dictionary

var myDictionary=new Dictionary<int,string>();

// 添加
myDictionary.Add(1,"C#");
myDictionary.Add(2,"JAVA");
myDictionary.Add(3,"C");

// 访问
myDictionary[1]  //C#

总结

本文仅仅简单介绍了基本数据类型的声明定义以及使用,而一般常用的数据类型提供了大量能使我们快速便捷地处理数据的函数和方法。

相关推荐
2401_857636397 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫5 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
颜淡慕潇6 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
独泪了无痕6 小时前
WebStorm 如何调试 Vue 项目
后端·webstorm
怒放吧德德8 小时前
JUC从实战到源码:JMM总得认识一下吧
java·jvm·后端
代码小鑫8 小时前
A025-基于SpringBoot的售楼管理系统的设计与实现
java·开发语言·spring boot·后端·毕业设计
前端SkyRain8 小时前
后端SpringBoot学习项目-项目基础搭建
spring boot·后端·学习
梦想画家8 小时前
理解Rust 生命周期、所有权和借用机制
开发语言·后端·rust