数据结构简介


前言

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


一、数据结构介绍

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

二、数据结构划分

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

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

  1. 数组 array
    数组是一个存储相同类型元素的集合,存储在计算机一块连续的内存空间,通过下标访问数据。
    a)查找就是计算偏移量来查找其他的值所以 时间复杂度是:O(1)
    b)增、删、改的操作会对移动原来的元素所以 时间复杂度是:O(n)
// 初始化一个长度为 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数组」是经常使用的数据结构,相比普通数组更加灵活。常用操作有:访问元素、添加元素、删除元素。

// 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是存储下一个结点地址的指针。
// 定义一个链表
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
    栈是有顺序的,在一片连续的内存,特性就是先进后出,由系统自动分配和维护,可以通过数组或者链表实现。
// 初始化一个栈
Stack st = new Stack();
// 通过数组定义一个栈
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(),展示了栈的先进后出特性。

// 初始化一个栈
st.Push('1');  //元素1入栈
st.Push('2');  //元素2入栈
st.pop();      //元素2出栈 
st.pop();      //元素1出栈

在这里插入图片描述

  1. 队列 queue
    队列也是有顺序的,特性就是先进后出,可使用数组和链表实现。
// 初始化一个队列
Queue q = new Queue();

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

q.Enqueue(1);  //元素1入栈
q.Enqueue(2);  //元素2入栈
q.Dequeue();  //元素1出队  
q.Dequeue();  //元素2出队

在这里插入图片描述

  1. 树 TreeNode
    树定义:包含满二叉树、完全二叉树、搜索二叉树、平衡搜索二叉树
    树存储:数组和链表存储,一般推荐链表
    树的遍历方式:深度优先DFS和广度优先BFS
    深度优先包括前序遍历
    两种遍历方式递归迭代
    ListNode就是节点对象 val存储数据元素的值,left是存储数据元素的左边指针right是存储数据元素的右边指针
// 定义一个树
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;
      }
  }
// 初始化节点
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判断会影响速度
// 初始化一个Dictionary

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

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

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

总结

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
当涉及到教学计划安排数据结构时,以下是一种可能的安排方式: 1. 简介和基础知识:介绍数据结构的定义、重要性和应用领域。讲解基本术语和概念,例如数组、链表、栈、队列、树和图等。 2. 线性数据结构:讲解数组、链表、栈和队列的原理、特点和操作。强调它们的适用场景和性能分析。 3. 非线性数据结构:学习树和图的基本概念,包括二叉树、二叉搜索树、堆等。介绍它们的特性、遍历方法和常见应用。 4. 排序和搜索算法:深入研究常见的排序算法,如冒泡排序、插入排序、选择排序、快速排序和归并排序。了解它们的原理、复杂度分析和实际应用。 5. 散列与哈希表:介绍散列函数和哈希表的工作原理,以及解决冲突的方法。 6. 综合应用:讨论如何使用数据结构解决实际问题,例如图算法、字符串匹配、模拟等。 7. 算法复杂度分析:学习如何分析算法的时间复杂度和空间复杂度,并了解最坏情况、平均情况和最优情况下的性能分析。 8. 数据结构的高级主题:介绍一些高级的数据结构,如平衡二叉树、B树、红黑树等。讨论它们的优势和应用场景。 9. 实践项目:通过编写实际的程序项目,巩固所学的数据结构算法知识。 上述安排仅供参考,可以根据实际教学需求和学生水平进行调整和扩展。同时,鼓励学生进行自主学习和实践,通过解决实际问题来加深对数据结构的理解和应用能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmHardy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值