前言
数据结构是程序员的基本功,程序 = 数据结构 + 算法 此章节是自己的学习记录
一、数据结构介绍
c
是为实现对计算机数据的各种操作,不同的数据结构有自己的使用场景,
目的是为了降低时间复杂度以及空间复杂度,一般都是以空间换时间,
提高程序的速度。
二、数据结构划分
c
1. 数据存储:数据存储的底层都是通过 <数组> 和 <链表> 来存储
2. 数据结构划分: 根据物理逻辑可以分为 <线性结构> 以及 <非线性结构>
a)线性结构有:「数组」、「链表」、「栈」、「队列」、
b)非线性结构有:「树」、「图」、「字典」、「堆」。
如图所示:PS这张图是引用了《图解算法数据结构》,这本书很棒,通过微信公众号《程序员鱼皮》了解到的,要是有侵权给我留言,我删除图片,没有用于商用就是用于兴趣学习,以后用的图也大部分是从其他地方,不喜勿喷,菜鸟学习记录中。 本节将使用C#
语言中各数据结构的初始化与构建方法来介绍各数据结构的基本特点。
数组 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);
链表 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;
}
}
栈 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出栈
队列 queue
: ==队列也是有顺序的==,特性就是先进后出,可使用数组和链表实现。
c#
// 初始化一个队列
Queue q = new Queue();
常用操作==入队 push()==,==「出队 pop()==,展示了栈的先进先出特性。
csharp
q.Enqueue(1); //元素1入栈
q.Enqueue(2); //元素2入栈
q.Dequeue(); //元素1出队
q.Dequeue(); //元素2出队
树 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;
字典 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#
总结
本文仅仅简单介绍了基本数据类型的声明定义以及使用,而一般常用的数据类型提供了大量能使我们快速便捷地处理数据的函数和方法。