博文
前序,中序,后序,广度的非递归程序实现(2007-03-24 21:39:00)
摘要: 早学完了二叉树。也知道了前序,中序,后序,广度的非递归是怎么实现的。但是一直没有写出程序出来。今天周末就把他写出来了,我觉得这些程序都很容易理解。所有没写什么注释了,这是用C++实现的。在栈是用STL种的栈实现的。如果大家用C语言编写,就一定要记得把它的栈写出来才可以实现。在整个程序中比较难理解的就是找父亲结点的算法和后序非递归实现的A,B。仔细理解还是看的懂的。程序我在VC6.0中实现的。其他编译器就不能保证了。
程序如下:
// 二叉树的建立。//前序,中序,后序,广度的非递归程序实现。#include <iostream>#include <stack>#include <queue>
using namespace std;
enum Tags{Left,Right};
template <class Elem>class TreeNode{ public: TreeNode* left; TreeNode* right; Elem data; TreeNode(Elem dataval,TreeNode* leftval=NULL,TreeNode* rightval=NULL) { data=dataval; left=leftval; right=rightval; } TreeNode(TreeNode* l......
二叉树的前序递归建立的详解(2007-03-23 19:57:00)
摘要: 这个二叉树的创建方法清华那本书中有一个通过前序建立的二叉树。我根据那里写了一个算法。
void BinTree<Elem>::Create(BinTreeNodeT<Elem> *Troot){ char ch; cin>>ch; if(ch=='$') Troot=NULL; else { Troot=new BinTreeNodeT<Elem>(ch,NULL,NULL); Create(Troot->left); Create(Troot->right); }}
可以看出这个算法的创建二叉树。可以通过Troot返回根结点。就可以创建二叉树了,但是如果你真正去试过的话。就会发现你通过Troot作为根结点进行遍历打印的时候确不能打印。甚至什么都没有啊,你看自己的程序再去推感觉真的没有错啊,怎么会没有数据呢?这个问题当时也困住我了,但是后来我用VC调试的时候发现Troot从创建的函数出来Troot==NULL所有在打印时候根本就不可能的。为什么会这样呢?我再通过调试发现在函数最后递归出来时。Troot就变成NULL了,仔细看看函数递归的过程。你就能......
二叉搜索树的建立(2007-03-23 19:06:00)
摘要: 最近学习的数据结构。在树和二叉树中程序实现的很少。今天把二叉搜索树建立了,
其实在二叉搜索树中插入和查找几乎是一样的。所以我为了更好的理解。在插入结点是我用非递归的实现。其实在非递归中还能很好的理解插入的过程。在查找中我就用了递归的方法。但是思路就没有非递归那样的清晰了,而删除函数我就没有写上去了,其实在学二叉树中我自己觉得在一些算法中还是很容易理解的。但是真正的编程实现就有一定的难度了,我这个问题困扰了很久了,我还写了一篇二叉树的创建。那里可以很好的理解怎么样创建二叉树。
#include <iostream>using namespace std;//树结点类的实现template<class Elem>class TreeNode{ public: TreeNode(Elem dataVal,TreeNode* leftVal=NULL,TreeNode* rightVal=NULL) { data=dataVal; left=leftVal; right=rightVal; } TreeNode(TreeNode* leftVal=NULL,TreeNode* rightVal=NULL) { left=leftVal; right=rightVal; } TreeNode* GetLeft() { return left; } TreeNode* GetRight() { return right; } Elem GetVal() { return data; }&n......
谈我对计算机学习的理解(2007-03-16 17:21:00)
摘要: 我们学校算是南方有名的学校.但我们学校计算机专业在全国来说根本没什么名气.又对于我来说更是没什么什么名气的学院.我在计算机方面也不是什么高手.我只是谈谈我对于计算机学习的一些理解.只是针对那些现在还没有进入计算机的同学和那些进入"计算机"但还没有真正学计算机的同学.我只是作为那些在半路醒来的同盟的一些建议.希望对他们有点用.
在网络上经常有一些高人写一些关于怎么学计算机方面的文章.我也看了不少.觉得他们说的很有道理.我也渐渐的按照他们的学习方法在学习了了,自我感觉对计算机方面还是有点兴趣.所以我选择了计算机.虽然说我对计算机还是感兴趣.但是我大一大二基本上是在逃课中度过的.我没有学什么东西.知道大二的下学期.我才重新学习我的专业.我们班的学习气氛很差.全班基本上就只有十几个同学在认真的读书。但真正能学很好的就拿不出几个.我就说说我们班的学习问题.也是很多的大学生真正出现的问题.
其实很多人学计算机.计算机却把他们带上了一条荒废的道路.我记得我们在大一的时候,大家都没有什么电脑.学习气氛真的很好。后来有同学开始买电脑了,同学们的心思都往游戏世界跑了,他们的灵魂不再属于学习.每天靠着游戏打发日子.知道现在还不知道C语言是什么东西.我也问过很多的同学,我说你真的不想再学习了吗.四年就这样度过了吗?他们说我也想读书啊。但是看不懂书啊,上课也听不懂.就是因为他们在以前学习C语言的时候没有学。现在导致一连串的反应.所以现在他们每天都在说我要好好学习了,可是却又没有回到游戏世界里面去了,其实这个现象不只是我们班.我想现在有很多的大学生都是这样的反应.直到毕业了才后悔当初没有学习.人就是这样的自己想的很好但是就是没有去实行.导致后来拉的课程越来越多.想补也觉得补不了了.干脆不学了.毕业拿到毕业证就觉得自己完成任务了。下面我谈谈在学习计算机课程方面的问题.
数学: 其实现在很多的大学生可能计算机没有学好但是数学还是认真去学了,因为那时还带着高中时期的学习热情.一般的学的还可以。不过我没有学......
浅谈程序员的数学修养 (2007-03-16 14:51:00)
摘要:可能有很多朋友在网上看过google公司早几年的招聘广告,它的第一题如下了:{first 10-digit prime found in consecutive digits e}.com,e中出现的连续的第一个10个数字组成的质数。据说当时这个试题在美国很多地铁的出站口都有大幅广告,只要正确解答了这道题,在浏览器的地址栏中输入这个答案,就可以进入下一轮的测试,整个测试过程如同一个数学迷宫,直到你成为google的一员。又如Intel某年的一道面试题目:巴拿赫病故于1945年8月31日。他的出生年份恰好是他在世时某年年龄的平方,问:他是哪年出生的?这道看似很简单的数学问题,你能不能能快地解答呢?下面则是一道世界第一大软件公司微软的招聘测试题:中间只隔一个数字的两个素数被称为素数对,比如5和7,17和19,证明素数对之间的数字总能被6整除(假设这两个素数都大于6),现在证明没有由三个素数组成的素数对。这样的试题还有很多很多,这些题目乍初看上去都是一些数学问题。但是世界上一些著名的公司都把它们用于招聘测试,可见它们对新员工数学基础的重视。数学试题与应用程序试题是许多大型软件公司面试中指向性最明显的一类试题,这些试题就是考察应聘者的数学能力与计算机能力。某咨询公司的一名高级顾问曾说:微软是一家电脑软件公司,当然要求其员工有一定的计算机和数学能力,面试中自然就会考察这类能力。微软的面试题目就考察了应聘人员对基础知识的掌握程度、对基础知识的应用能力,甚至暗含了对计算机基本原理的考察。所以,这样的面试题目的确很“毒辣”,足以筛选到合适的人。
四川大学数学学院的曹广福教授曾说过:“一个大学生将来的作为与他的数学修养有很大的关系”。大学计算机专业学生都有感触,计算机专业课程中最难的几门课程莫过于离散数学、编译原理、数据结构,当然像组合数学、密码学、计算机图形学等课程也令许多人学起来相当吃力,很多自认为数据库学得很好的学生在范式、函数依赖、传递依赖等数学性比较强的概念面前感到力不从心,这些都是因为数学基础或者说数学知识的缺乏所造成的。数学是计算机的基础,这也是为什么考计算机专业研究生数学都采用最难试题(数学一)的原因,当然这也能促使一些新的交叉学科如数学与应用软件、信息与计算科学专业等飞速发展。许多天才程序员本身就是数学尖子,众所周知,Bill Gates的数学成绩一直都很棒,他甚......
详解链表的转置问题。(2007-02-15 01:40:00)
摘要://题目: ------------------链表的转置------------------------// 要求:// 将链表的就地转置。就是将链表的数据存储倒置//例:// 输入:12345678910// 输出:10987654321
// 算法分析:// 程序最主要的地方再于将头接点的后的每个接点都放再头接点的前面。直到头接点到达// 尾接点。记完成了链表的转置。// 算法复杂度分析:// 只是将每个接点前移所以复杂度就链表的长度。O(N);// 程序分析:// 程序采用的时C++实现的方式;时用类实现每个接点。程序中用到了可利用空间表,从而加快了// 程序中要删除接点再生成接点的速度。采用C++的重载new和delete函数。也用到了静态的类成员// 数据成员用来实现可利用空间表。
#include <iostream>using namespace std;//数据接点的类的实现。template <class Elem>class List{ private: static Li......
计算机专业生应该学什么[摘](2007-02-05 00:28:00)
摘要:
ispexceed 发表于 2006-6-8 1:15:35
计算机专业生应该学什么
收到一封mail,是一个计算机系大三学生写来的,想听听我的建议,面临将要毕业的关口,应该学点什么才能对将来有用。随后又有不少朋友通过mail,im等等方式询问我对这个问题的看法。想必是上次csdn视频聊天的节目引起了不少朋友的思考。
我本来不是计算机专业出身,也并非大师之类的人物,本来不敢好为人师。不过,既然作了这个行业,也算有点心得,被问到,也就说点心得和建议,对与不对,各位看官指教。盖个体情况差距极大,本文是个人观点,也就姑且一听,有用则用,当然,这世上怕也没有所谓万全之策的。
1 你是否真的喜欢计算机
我是真的喜欢的。如果让我选择发了大财做什么,我仍然继续玩计算机,只不过可以更自由自在的玩喜欢的东西。如果你也喜欢,喜欢学新的东西,喜欢复杂而精巧的设计,喜欢工程之美,那就适合走技术道路。如果不是这样,这条路比较辛苦,还请三思。其实产业里相关的领域也大有可为,比如说写技术相关的趋势作者,鲜有优秀的。目前除了互联网周刊的陈琼同学,我还没看到给商业媒体写技术相关的写手有几个写的好的,甚至往往都有致命的本质错误。诸如此类的周边领域很多,都有不错的机会,不一一列举。
2 假如1你回答的是喜欢,那么
你需要学习很多东西。我认为不可缺少的东西包括:
* 基础理论* 算法* C语言* C++或java,如果精通C,可以舍弃C++,学java* unix* 正则表达式* 任何一种脚本语言(目前推荐python)
依次讲解为什么这么说
* 基础理论和算法20年来,应用层面急速发展,令人眼花撩乱,而实际上,大幕之后的东西,从1972年C和unix诞生以来就没有过本质的变化。在操作系统,数据库理论,编译原理,信息管理系统理论之类,都是*相对*静止的。虽然其中有类似于微内核还是整体内核之类的理论之争,但是几乎不影响格局,大可以放心去学。学这些东西唯一的问题是理论枯燥,最好是结合实践,做一些应用,学一些理论,张弛有度,这样总能保证好奇心旺盛。
学这些东西的目的是为了真正的了解计算机。不真正了解一个东西,很难举一反三,很难作到融汇贯通。其实高校教的这些东西都极有价值,只不过是在缺乏实践的基础上填鸭,效果往往变成了应付考试。
* C语言我对C语言的认识如......
学数据结构方法[摘](2007-02-05 00:26:00)
摘要:
北京大学信息科学技术学院
04级计算机2班
00448245 柳明海
1. 前言
首先感谢张老师给我这样一个机会, 来和大家分享学习数据结构的经验。
2. 学习方法。
因为要准备这个话题, 所以我认真的思考了我的学习方法, 但是我觉得基本上我就是上课前看看书、上课时认真听课、 下课以后复习复习、当然还有做作业时很认真的去做。根本谈不上什么好方法, 不过我还是有一些话要送给大家。
我能行!
个人觉得这句话非常重要,不知道大家是怎样看待数据结构这门课的, 有多少人觉得数据结构很难呢?我知道还是有一些同学这样觉得的, 有时候我跟我的朋友讲要怎样学,讲了一大堆以后, 他就向我抱怨:我以前c++都没有学好, 数据结构更学不好了, 这哪跟哪的话啊,数据结构与c++没有什么关系,我想假如抱有这样的心态, 自己就不相信自己, 那是不可能学好的, 然后那些觉得数据结构很难的同学, 我想他们应该会很看重数据结构的吧, 然后就一天到晚捧着一本数据结构, 这样不会觉得很累吗?而且因为觉得很难, 就容易不相信自己, 学的效率也不会很好, 个人认为数据结构很好学, 很容易学, 或许这有点妄自菲薄吧, 但是因为我觉得很容易, 当然就会觉得自己没问题, 学得很轻松, 效果也还可以。大家都是从高考走过来的, 应该知道心态的重要性吧, 两种不同的心态, 完全就是两种不同的效果。 学了这么久数据结构了, 我们到底在学些什么呢? 不知道大家有没有想过, 那现在我们现在来归纳一下我们学习的内容吧, 其实学到现在我们也就学了几种普通的数据结构, 象二叉树, 树, 图,还有排序的问题, 前面的线性表和字符串也就是一些概念, 当然还有一个很重要的KMP算法, 然后在每种数据结构中我们也就是学到了若干处理的算法, 我想真正数起来也就是几十个算法吧。 学习数据结构也就是要掌握这几十种算法, 多简单。至于如何掌握每个算法呢, 我想就是多看看书, 重要的是能够理解。
我能独自完成作业!
这里我的定义和张老师的不同, 张老师是鼓励大家讨论的, 不过我发现还是有一些同学就是先问好别人算法,然后再自己写, 虽然这个不算抄袭作业, 但自己基本上没......
约瑟夫环C++循环单链表实现程序(2007-02-02 18:22:00)
摘要:////////////////////////////////约瑟夫环程序C++循环单链表实现。///////////当中的new和delete采用了重载函数。//也采用了可利用空间表提高了系统分配和回收的速度。// 题目:// 编号为1,2,3。。。。N的N个人按顺时针方向坐成一圈。每个人有一个密码,一开始任选一个// 整数作为报数上限值M,从第一个人开始按顺时针方向自1开始顺序报数。报到M时停止报数,报M// 的人出列,将他的密码作为下一次报数的新值M,从他的顺时针方向上的下一个人开始重新从1// 开始报数。如此下去直到所有人都出列为止。
#include <iostream>using namespace std;//每个人的号码和密码。struct people{ int NO; int pass;}node;template <class Elem>class Link{private: static Link<Elem>* freelist;//静态数据成员的头接点。public: struct people element; Link* next; Link(people elemval,Link* nextval=NULL) { element.NO=elemval.NO; element.pass=elemval.pass; next=nextval; } Link(Link* nextval=NULL) { next=nextval; } void* operator new(size_t);// 重载new 函数。 void operator delete(void*);//重载delete函数。};
template <class Elem>class LList{private: Link<Elem> *head; Link<El......
