前言:
而今兄弟们对“数据结构c取栈顶算法代码”都比较珍视,各位老铁们都想要剖析一些“数据结构c取栈顶算法代码”的相关内容。那么小编同时在网络上网罗了一些有关“数据结构c取栈顶算法代码””的相关文章,希望朋友们能喜欢,姐妹们快快来了解一下吧!对于软件工程师来说,编程语言是基础,会了编程语言,再熟悉一下几个基本的操作接口,就能开发一些基本的程序功能了。
然后再升级一点,需要了解一下行业知识,图形方向的软件工程师需要了解图形学;通信方向的软件工程师需要了解通信和网络协议之类的。
但不管对于哪个领域的软件工程师,有一个知识是通用的,那就是数据结构和算法的知识。
假如有数据结构和算法基础,我们写什么软件都会变得得心应手。当然,现代很多语言都封装了数据结构和算法的API库,比如C++的stl库。
数据结构主要是研究怎么将大量数据组织起来,并且对他们进行读,写,插入,删除等各种操作的。
最基础的两种数据结构是数组和链表:
数组是比较自然的,在C语言中,通过“ 数组名【索引】 ”的方式进行查找,其主要思路是,数组名相当于指向一个内存区域的指针,比如一个名为buffer的数组。array【0】就相当于在解释array + 0*单位数据占字节数 位置处的数据。array【n】就相当于解释buffer + n*单位数据占字节数 处的数据。
链表是利用指针和寻址机制来组织的;一个节点处保存了一段数据和一个指针(一个内存地址),比如想要找到list【3】的链表,需要先读list【0】(头结点),从list【0】里找到list【1】的地址,通过地址找到list【2】,再在list【2】里找到list【3】的内存地址。它不能像数组一样通过数学方式对头节点进行某种计算得出同数组里其他节点的值,它要一个个的去读取下一个地址,一直到找到正确的位置,取其正确的值。
各种软件用得最多的数据结构是栈,和其规则比较相似的还有队列:
栈和队列在保存数据上并没有什么特殊之处,他们只是在加入数据和清除数据时有一套特殊规则。它实际保存数据的方式既可以像数组一样保存,也可以像链表一样保存。(通常用数组形式比较多)
栈的加入和删除数据的规则就是,只能在栈顶加入或者删除数据,比如一个名为stack的栈,现在只有stack【0】和stack【1】,它想要加入新数据就只能加入stack【2】,它不能往栈中间插数据。它想要删除数据就只能删除stack【1】,不能删除stack【0】。
栈的规则就像洗碗时候放碟子一样,正常人洗碗之后,碟子都是放在碟子堆顶,然后取用碟子的时候,也是从碟子堆顶取用。
队列的加入和删除规则是先进先出了,就像排队买什么东西的,新来一个要排队的人,是往队尾加入的,然后队首处理完之后,就会离开队伍。
然后,存在矩阵这种数据结构。用起来挺麻烦的,主要在图形领域用的比较多,处理图形变换之类的。
还有一个和栈一样,用得最多的数据结构:哈希表
哈希表的思路就是:用一个哈希函数映射地址和值。
在我们的数组里,地址就是地址,值就是值,他们之间没有什么联系,我们可以在array【0】里填999,也可以在array【999】里填1;在数组里,地址和值是没有关系的,在这种时候,我们要想找到一个特定的值,通常就只能从array【0】一直找到array【n】了。
但很多时候,我们保存的值并不需要频繁修改,同是我们需要频繁查找到保存这个值的位置;哈希表的思路是:我们可以用一种规则将“值”和“索引”关联起来。
比如哈希函数是f(x) = x%17;x是值,f(x)是索引,对于一个值为18的数据对象;我们可以把他放在hash【1】的位置,这样,下次我们要找到这个值为18的数据对象的内存地址的时候,我们直接访问hash【1】就行。
当然,如果仅仅是上面这个哈希函数的规则,值为35的数据对象也是要保存到hash【1】这个内存地址的,这样就产生了冲突。
通常哈希表会使用一些手段避免冲突,同时解决一些必要的冲突;比如哈希链表,线性分布之类的。
哈希链表是复合型的数据结构,与之类似的还有跳表等,就不多赘述了。
随后就是树和图了,树和图的种类很多,我们介绍几个
二叉树:每个节点有两个子节点,和链表类似;链表是一个节点保存下一个节点的位置,而二叉树是一个节点保存两个其他节点的位置;
平衡二叉树(AVL树,红黑树):二叉树加了一些规则以保证查找效率,在建立时保证有序(左节点永远小于自己,右节点永远小于自己),加入新节点时和删除节点时通过一些手段(转置之类的)保证有序,就可以在插入和查找时保证效率了。
B树,线段树:就是使一个节点处的值是一个范围,或者多个键值(判定节点大小和排序整数),范围有序,可以将数据按一定的想法分割到对应区域。保证读写的效率。
有向图和无向图:节点有任意数量的边,边连接两个节点。有向无向是指边有向还是边无向。
边带权图:边有权重,表示成本和距离之类的概念。
图这个数据结构相对来说还是比较复杂的,我做不到相对简洁完整的解释;同时图的相关算法是计算机科学最前沿最热门的领域之一了。
谷歌字节百度这些公司的核心产品里用到了很多图论算法的成果。
这些数据结构如果有很多时间和精力的话,我们可以基于基本的C/C++语言和内存控制写出来,但一方面我们要谋生,并没有那么多时间,另一方面我们写出来的数据结构也是需要调试debug的,也不是写出来就立刻能用。
好在这些基本数据结构相对是比较通用的,存在已有的数据结构库了;其中比较有代表性的是C++的STL库。
C++的STL库里,数组vector,链表list,栈stack(通常我是用vector模拟),队列queue,哈希表unordered_map,unordered_set;红黑树map,set。
STL库里有个迭代器,实际上就是指针的包装器类。
这些数据结构的用法是比较简单的;按照语法来就行,常见的插入,删除,访问数据等都有。对于绝大多数的场景性能都是比较好的。
介绍数据结构好像必不可少要讲讲算法.......,算了,有点困了,睡觉。
标签: #数据结构c取栈顶算法代码