08 2013 档案

摘要:八大排序方法汇总(选择排序-简单选择排序、堆排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序,归并排序,计数排序)。 插入排序还可以和折半查找相结合,提高查找插入位置的速度,也就是折半插入排序,此处没有给出这种方法的相应代码。 对排序算法,可从以下几个方面评价: 时间复杂度; 空间复杂度; 稳定性。 阅读全文
posted @ 2013-08-22 15:35 永不止步,永无止境 阅读(540) 评论(0) 推荐(0) 编辑
摘要:循环链表、数组解决约瑟夫环问题的比较。 注意几点: 循环链表的建立不难,在删除循环链表中元素时,用pCur->next != pCur判断结束; 每一轮计数开始,将计数器归1,counter = 1; 并将指针指向下一个元素,pCur = pCur->next; //从下一个元素开始计数 阅读全文
posted @ 2013-08-18 21:34 永不止步,永无止境 阅读(404) 评论(0) 推荐(0) 编辑
摘要:链式存储的队列的实现,包括队列的初始化、销毁、入队、出队、测长、获取队首元素等基本操作。 注意几点: 队列结构,包含一个头指针、一个尾指针,初始化为空队列,空队列的队首指针与队尾指针相同; 链表包含头结点,否则在队列为空以及队列只有一个元素时都是队尾至真与队首指针相等,无法区分 有动态分配空间,就要释放,本实现中用DestoryQueue释放动态内存; 带有头结点,队列的第一个元素在头指针指向的结点中,对非空队列,队列中第一个元素为q.front->next->data; 而非q.front->data; 在出队以及获取队首元素时,要考虑队列空否,本实现中用assert( !IsQueueEmpty(q) ); 检查。 阅读全文
posted @ 2013-08-18 20:16 永不止步,永无止境 阅读(1008) 评论(0) 推荐(0) 编辑
摘要:两个栈实现一个队列,包括队列的初始化、销毁、入队、出队、测长、判断空否、显示队列元素等操作。 小结: 用两个栈作为队列结构,一个用于入队,另一个作为出队的辅助栈,如代码中栈sEnQueue、sDeQueue为队列结构的两个成员; 初始化队列,即两个栈的初始化,如代码中函数InitQueue; 队列销毁,即两个栈的销毁,如代码中函数DestoryQueue; 出队,若sDeQueue为空,则将sEnQueue的元素倒入sDeQueue,然后取其栈顶元素;若非空,直接取其栈顶元素; 入队,即sEnQueue的入栈操作; 队列测长,即两个栈的长度值之和; 注意队列的显示总,两个栈的显示顺序不同,才能得到正确的显示。 阅读全文
posted @ 2013-08-18 19:11 永不止步,永无止境 阅读(419) 评论(0) 推荐(0) 编辑
摘要:顺序存储的栈的缺点: 存储空间有限,当栈中元素个数超出定义的栈的MAXSIZE时,再进行插入,就会出现访问越界。当然,可以通过realloc重新分配内存以扩大容量,不过这样不但会增加复杂度,而且要求存储空间是连续的,当内存中没有这么大的连续空间时,就会发生内存溢出; 为了解决这个问题,链式存储的栈不失为好的办法,下面是用链表实现的栈。 用链式存储是实现栈时,注意几点: 将链表头结点作为栈顶,而且也不需要附加的头结点; 栈的结构只有一个链表指针; 栈的初始化,就是将链表头结点置为NULL; 栈的销毁,就是链表的销毁; 栈的push、pop,就是在链表的头部进行插入、删除的操作,在pop时,注意对空栈的处理,下面的代码中用assert(NULL != s.top);检查是否为空; 求栈的长度的操作,就是求链表长度; 获取栈顶元素,就是获取链表头结点元素,注意对空栈的处理,下面的代码中用assert(NULL != s.top);检查是否为空。 阅读全文
posted @ 2013-08-18 16:13 永不止步,永无止境 阅读(613) 评论(0) 推荐(0) 编辑
摘要:顺序存储的栈的实现,包括初始化、销毁、push、pop、求长度、显示栈中元素、获取栈顶元素等基本操作。 注意: 通过动态申请的空间一定要销毁,本实现在InitStack函数中申请空间,使用完后在函数DestoryStack中销毁; 栈显示时,注意下标的更新不是在while条件判断时,应在显示元素之后,如下: 阅读全文
posted @ 2013-08-18 15:40 永不止步,永无止境 阅读(341) 评论(0) 推荐(0) 编辑
摘要:素数、最大公约数、最下公倍数、质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解。 小结: 求1到n之间的素数的基本方法是通过遍历2到sqrt(n),判断每个数是否是素数来得到,但这种方法效率很低;比较高效的解法是通过筛选法求解,如下面代码中函数GetPrimeUnderNBySieve; 最大公约数可通过GCD递归定理求解,通俗的说法就是辗转相除法,《算法导论》中有详细的说明; 最下公倍数可通过最大公约数得到,公式为:LCM(a,b) = a*b / GCD(a,b); 质因数分解可通过质数表得到,如下面代码中函数GetPrimeFactorByPrimeTable所示; 另外,最后一种因数分解代码是最简练的,如函数Decomposition所示, 阅读全文
posted @ 2013-08-18 11:37 永不止步,永无止境 阅读(840) 评论(0) 推荐(0) 编辑
摘要:双向链表的操作。 阅读全文
posted @ 2013-08-17 17:59 永不止步,永无止境 阅读(332) 评论(0) 推荐(0) 编辑
摘要:再次写链表的基本操作,包括前插法创建链表、链表的插入、删除、排序、翻转、显示、销毁。 此次写的链表时带有头指针的,是否有头指针,对于链表的各个操作都会有影响,与之前写的不带头指针的链表相比,确实方便很多,不易出错。 小结: 对于带有头结点的链表,空链表(pHead->next= NULL)与头指针为NULL的链表(pHead = NULL)是不同的,后者是非法的链表,要当做异常处理; 函数入口对于异常输入的处理,比如下面代码中多个函数中的assert(pHead != NULL);排除了链表头结点为空的异常情况; 函数对于特殊输入的处理,比如插入、删除的位置大于链表长度,以及链表为空的处理;链表翻转时链表长度为空或1时直接返回即可;在函数开始时最好就对这些特殊的输入进行处理,以免遗漏; 存放插入、删除的位置、链表长度的变量为size_t类型的,排除了非法的负数的情况,但也要注意这种做法带来的副作用,就是对于size_t类型的变量0-1的结果为最大的正数,而非负数,判断循环结束时,应注意到这个问题。 输入ctrl+z结束键盘输入后,要想再次从键盘接收输入,必须用 阅读全文
posted @ 2013-08-17 16:42 永不止步,永无止境 阅读(1226) 评论(0) 推荐(0) 编辑
摘要:介绍STL模板的书,有两本比较经典: 一本是《Generic Programming and the STL》,中文翻译为《泛型编程与STL》,这本书由STL开发者 Matthew H.Austern编著,由STL之父alexander Stepanov等大师审核的,介绍STL思想及其使用技巧,适合初学者使用; 另一本书是《STL源码剖析》,是《深入浅出MFC》的作者侯捷编写的,介绍STL源代码的实现,适合深入学习STL,不适合初学者。 下面主要介绍泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系。 阅读全文
posted @ 2013-08-11 11:06 永不止步,永无止境 阅读(2683) 评论(0) 推荐(1) 编辑
摘要:这两天看进程的同步与通信,看了几本书上的介绍,也从网上搜了很多资料,越看越迷惑,被这几个问题搞得很纠结。 进程同步与互斥的区别? 进程的同步方式有哪些? 进程的通信方式有哪些? 进程同步与通信的区别是什么? 线程的同步/通信与进程的同步/通信有区别吗? 在好多教材上(包括国内与国外的)也没有明确这些概念,现在对每个问题还没有准确的答案,下面将自己的理解记下来,以后再补充。 参考资料: 《操作系统教程》 孙钟秀主编 费翔林 骆斌 谢立参编 高等教育出版社 阅读全文
posted @ 2013-08-10 16:49 永不止步,永无止境 阅读(11778) 评论(2) 推荐(6) 编辑
摘要:最近看操作系统的书,对于应用程序、进程、线程的概念一致停留在书本上的文字,而不知道其真正的含义。下面是从网上看了一些文章后的理解,以浏览器的使用为例,给出了从计算机用户的角度应如何看待从计算机用户的角度看应用程序、进程、线程的,初步认识,还望高手指教。 阅读全文
posted @ 2013-08-05 19:15 永不止步,永无止境 阅读(456) 评论(0) 推荐(1) 编辑
摘要:1)++为自增,--为自减,这两种操作符都分别有前置与后置来两种形式,要搞清楚两种形式的差别。下面以自增操作符为例进行说明。 前自增操作符是操作数加1,操作结果是修改后的值,返回的是对象本身,是左值; 后自增操作符同样对齐操作数加1,但是操作后产生操作数原来的,未经修改的值作为表达式的结果,返回的是右值; 2)C++primer 5.10 节讲到复合表达式求值,提到“一个表达式里不要在一个或更多的子表达式中对同一个对象做自增或自减操作”,因为其求值顺序不易把握,容易出错,下面给出了复合表达式中使用自增操作的例子,求值的顺序并不是每个人都能够正确把握的。 阅读全文
posted @ 2013-08-02 14:32 永不止步,永无止境 阅读(510) 评论(0) 推荐(0) 编辑
摘要:在程序员面试宝典的第五章,5.4节有一道题,指出左移操作符>>的优先级高于按位取反操作符~,是错误的,是整型提升造成的假象;左移>>的优先级是低于取反~的,正如在C++primer等其他教材上所说的,下面给出详细说明。 注意点: 在执行算术操作之前,将二元操作符(如算术或逻辑操作符)的两个操作数转换为同一类型,并使其表达式的值也具有相同的类型。 整型提升就是,就是对于所有比int小(此处指的是位宽)的整型,包括char、signed char、unsigned char、short、unsigned short,如果该类型的所有可能的值都包括在int内(如果unsigned short为32位,int也为32位,那么此时int型就不能包括所有的unsigned short,就需提升为unsigned int),它们就会被提升为int型,否则,它们将被提升为unsigned int。 阅读全文
posted @ 2013-08-01 21:58 永不止步,永无止境 阅读(1060) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示