![](https://img-blog.csdnimg.cn/20190830101431783.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构和算法
Cco丶
学海无涯
展开
-
单链表
线性表的一种常见存在形式,链表。在链式存储的过程中,每个元素Node不仅包含元素本身的信息,还包含元素之间的逻辑信息。前驱结点包含后继结点的地址信息(指针域),可以很方便的找到后继结点的位置。今天先来认识一下单链表:每个结点除包含数据域外,只设置一个指针域,来指向后继结点,这样构成的链表就是单链表。在链表中都会有一个头指针,便于插入和删除,可以通过头结点,沿着链,遍历每一个链表中的结点。...原创 2019-04-26 20:27:02 · 150 阅读 · 0 评论 -
栈和队列的实际应用
1.将一个非负的十进制整数N转换成其他D进制数。解决思路,连续取模%和整除/。D进制各数位的产生顺序是从低位到高位,而输出顺序却是从高位到低位,刚好相反,可以考虑使用栈进行逆序输出。 public static string DecConvert(int N,int D) { if (D < 2 || D > 16) ...原创 2019-05-14 22:23:53 · 5519 阅读 · 0 评论 -
Queue--队列
队列(Queue)和栈不同,队列是只允许在一端插入,在另一端进行删除的线性表,所有的插入操作都在队尾进行,删除操作则在队头进行。入队和出队顺序一样。由于数组在删除元素的时候,需要花费大量时间移动元素,所以基于数组的队列很少有实际应用,多采用循环队列方式。本文主要介绍也是循环队列,将一个一维数组中各个元素看成一个首尾相接的封闭圆环。两个基本操作:入队: Enqueue: 将一个数据插...原创 2019-05-14 20:43:29 · 560 阅读 · 0 评论 -
带有密码的约瑟夫问题
约瑟夫问题,归结起来就是有N个人围坐一圈,从第k个人开始报数,每次数到M的人出圈,继续从出圈的下一个人开始报数,直到最后一个人出圈,问所有的出圈顺序。和上一篇文章解决的问题不同的地方是,这次从K开始数,并不是从第一位开始。其实在解决的时候,只需要解决掉第一次数数,后面的就是和上一篇所讲的一样了。代码如下: SingleCircleLinkList list = ...原创 2019-04-30 21:06:43 · 2661 阅读 · 0 评论 -
约瑟夫问题
著名的法国数学家加斯帕•蒙日,曾在《数学的游戏问题》中讲了一个故事:有15个教徒和15个非教徒在海上遇险,必须将一半的人投入海中,其他的人才能幸免于难,于是想了一个办法,30个人围成一个圆圈,从第一个人开始依次报数,每数到9的人,就被扔入大海,之后从被扔入海中的下一个开始数,依次循环,直到剩余15人,问 怎么排位置,才能让扔入大海的人全为非教徒。这就是著名的约瑟夫问题。这么一想,一圈人依次...原创 2019-04-28 20:07:05 · 414 阅读 · 0 评论 -
排序算法--选择排序,插入排序
1.选择排序选择排序思想:遍历一组无序数列,默认第一位为最小值,从剩下的数列中,找出最小的那一个,记录下来,和第一位互换位置。依次循环下去,直到排序完成。(图借鉴:https://www.cnblogs.com/weiios/p/3933996.html)选择排序的比较次数和冒泡排序一样,但交换次数要少于冒泡排序 private void SelectSort(List<i...原创 2019-03-04 13:52:31 · 491 阅读 · 0 评论 -
排序算法--快速排序
面试题中几乎都会有一道关于排序的算法题。个人感觉冒泡排序很low,但是确实通俗易懂。上次面试的时候,那个面试官让我讲一下快速排序的思想。。。当时只记得选一个基准数,然后比较比较(顿时脑子懵了)之前确实看过这几种排序,有一点点印象。但是没那么熟,那次回去之后,心里想一定要记牢这几种排序算法(理解这几种算法的思想)先来看看快速排序的思想(图借鉴https://www.cnblogs.com...原创 2019-03-04 10:28:45 · 135 阅读 · 0 评论 -
栈--Stack
在.net中,值类型在栈上分配,引用类型在托管堆上分配。栈,是线性表的特例,只能对线性表的一端进行插入和删除操作。“先进后出” 或者 “后进先出” 的特点。示意图如下:1.栈顶:允许进行数据删除和插入操作的一端2.栈底: 不允许在栈中操作的一端3.Push: 进栈,将元素放入栈顶处4.Pop :取出栈顶元素并删除栈中数据5.Peek:取出栈顶元素,不删除数据在栈中栈的简...原创 2019-05-02 21:50:25 · 124 阅读 · 0 评论 -
双链表
单链表中每个结点只有后继结点next 属性,在查找上一个结点的时候,很不方便,我们可以给结点添加 一个指向前驱结点的指针域,使链表进行双方向查找,这种链表就叫做双链表。示意图如下:结点信息链表结构示意图:双链表有两个指针域,所以在插入删除元素的时候,比较麻烦,一个结点要修改两个指针域,而且是有先后顺序的修改。1.结点的插入操作假如当前结点为N,在该结点前插入S结点,那么...原创 2019-05-02 20:54:15 · 217 阅读 · 0 评论 -
带有tail指针的单向循环链表
前面在实现单链表的时候已经说到,单链表的效率问题,每次要从头结点遍历到表的尾部,所以很影响效率,我们可以将头指针改为尾部指针tail。同时让tail指针的后继结点指向头结点。这样就构成了一个环,就是单向循环链表。如下图所示:这样在添加元素的时候就不需要遍历整个链表,从而大大提高了效率。 class SingleCircleList { //元素个数 ...原创 2019-04-26 21:35:45 · 2877 阅读 · 0 评论 -
二叉树的深度优先遍历和广度优先遍历
二叉树结构简单,存储效率高,算法简单,每个结点至多有两个子树,两个子树有左右之分,次序不能颠倒。二叉树的存储结构分为:顺序存储结构和链式存储结构。1.顺序存储结构把一棵满二叉树自上而下,从左到右顺序编号,把编号依次存放在数组中,如下图所示:设满二叉树结点在数组中索引号为i,那么有如下性质:(1)如果i=0,此结点无双亲,为根结点(2)如果i>0,其双亲结点为(i-...原创 2019-05-16 21:26:40 · 13071 阅读 · 0 评论