程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

2013年10月11日

并查集

摘要: 并查集 并查集是一种简单且强大的工具。本文我们就是学习并介绍一下并查集。并查集的资料网上有很多,也有很多代码实现。博主在学习的过程中也查阅了很多资料,有兴趣的话可以Google之。 并查集有三个数据结构: 集合:实际元素组成的集合 类信息:记录元素的类信息 秩信息:记录元素的高度 并查集包含三种基本操作: Init:初始化,将集合每个元素看做一个类别,元素的类信息即为自身,秩信息都为0 Find:查找,根据给定的元素,返回其类别信息。在执行查找的过程中进行路径压缩优化,以提高后续Find的效率。 Union:合并,将两个元素所在的集合进行合并(集合用其中的元素来表示),在合并的过程中同样进行优 阅读全文

posted @ 2013-10-11 16:40 unixfy 阅读(353) 评论(0) 推荐(0) 编辑

另一版本的基于堆栈的虚拟机实现

摘要: 另一版本的基于堆栈的虚拟机实现 前面我们对一基于堆栈虚拟机进行了源码剖析《基于栈的虚拟机源码剖析》。之前我们也实现了一个简单的基于堆栈的虚拟机《实现一个堆栈虚拟机》。在《实现一个堆栈虚拟机》中,我们将虚拟机定义为一个VirtualBox类,VirtualBox类中有成员变量:堆栈、指令内存、数据内存,另外还有成员函数:读取指令、执行指令。《基于栈的虚拟机源码剖析》中,是C语言实现的,没有设计成类的形式,但依然有堆栈、指令、数据、读取指令、执行指令等模块。 这里,我们再次实现一个基于堆栈的虚拟机。先给出实现代码,然后再对代码进行解释。// 基于堆栈的虚拟机实现#include #include 阅读全文

posted @ 2013-10-11 00:32 unixfy 阅读(1181) 评论(0) 推荐(0) 编辑

2013年10月9日

参数解析之写入参数解析

摘要: 参数解析之写入参数解析 之前我们有篇关于参数解析的文章《参数解析》,在文章中我们讨论了对函数参数进行了解析,分为两种方法:状态转换图和顺序扫描。函数参数为一个字符串,格式为:file1|dataitem1|dataitem2|dateitem3|$file2|dataitem4|dataitem5|$file3|dataitem6|$ 通过我们的解析得到: file1 dataitem1 dataitem2 dataitem3 file2 dataitem4 dataitem5 ... 阅读全文

posted @ 2013-10-09 23:20 unixfy 阅读(489) 评论(0) 推荐(0) 编辑

2013年10月8日

基于栈的虚拟机源码剖析

摘要: 基于栈的虚拟机源码剖析 之前我们曾剖析过一个栈虚拟机《栈虚拟机源码剖析》,并实现了一个栈虚拟机《实现一个栈虚拟机》。 本文我们对Kevin Lynx的《基于栈的虚拟机的实现》进行学习,学习其源码实现原理和技巧,其源码地址为:source code。 有关该基于栈的虚拟机说明,可以直接参考原文,我们不在此赘述。这里,我们主要是对源码进行分析学习。 该虚拟机对应两个文件:头文件sm.h和源文件sm.c。 其中,sm.h中定义了虚拟机的指令集(二进制指令集),该指令集为枚举类型:enum op_type{ opHalt, opIn, opOut, opAdd, opSub, opMul, op... 阅读全文

posted @ 2013-10-08 22:25 unixfy 阅读(2219) 评论(0) 推荐(0) 编辑

实现一个反汇编器

摘要: 实现一个反汇编器 上文《反汇编器源码剖析》,我们对一反汇编器源码进行了学习,了解了反汇编器的实现原理。反汇编是汇编的逆过程,其也是包含三个主要部分:汇编指令集二进制指令集二进制指令到汇编指令的映射 有了这三部分之后,我们就可以对二进制指令,将其翻译成汇编指令,也就完成了反汇编过程。 我们的二进制指令集和汇编指令集还是沿用之前的指令集。 下面我们先给出实现的反汇编器,然后对相关代码进行解释。// 实现一个反汇编器#include #include #include #include #include using namespace std;enum BinIns;// 二进制指令结构体//... 阅读全文

posted @ 2013-10-08 21:05 unixfy 阅读(2374) 评论(0) 推荐(0) 编辑

反汇编器源码剖析

摘要: 反汇编器源码剖析 之前我们有对一汇编器进行源码剖析,详见《汇编器源码剖析》,并且《实现一个汇编器》。本文,我们继续之前的工作,对反汇编器进行源码剖析,之后我们会根据反汇编器的实现原理,实现一个自己版本的反汇编器。本文剖析的反汇编器代码详见:source code。 源码中反汇编器对应的文件为sdasm.c。 sdasm.c文件中包含汇编指令集的定义op_desc,其类型为字符串数组。const char *op_desc[] = { "HALT", "IN", "OUT", "ADD", "SUB&quo 阅读全文

posted @ 2013-10-08 20:50 unixfy 阅读(1633) 评论(0) 推荐(0) 编辑

实现一个汇编器

摘要: 实现一个汇编器 上文《汇编器源码剖析》中,我们对一汇编器进行了源码剖析,这里我们仿照其实现一个自己版本的汇编器,90%的东西都是借鉴于上文中的源码。 实现一个汇编器,首先需要定义一个汇编指令集,这里我们还是沿用上文中的汇编指令集。汇编指令与指令之间是一一对应的关系,也就是说是直译的过程。我们的指令集是枚举类型,也是沿用上文源码的指令集。 我们的函数功能是对输入的汇编指令,将其读入,翻译成对应的二进制代码,然后将其输出。 实现汇编器的重点在于理解汇编器的原理,而汇编器的原理就在于定义好汇编指令集、二进制指令集,并且确定好二者之间的映射转换关系。 以上即是汇编器的原理。具体如何定义汇编指令集... 阅读全文

posted @ 2013-10-08 20:44 unixfy 阅读(8689) 评论(1) 推荐(2) 编辑

汇编器源码剖析

摘要: 汇编器源码剖析 本文我们对一汇编器源代码进行剖析,了解汇编器实现原理,进而我们根据样例,自己实现一个汇编器。实现自己版本的汇编器放在另一篇中,本文主要是对别人的源码进行剖析。 本文源代码是来自Kevin Lynx的《基于栈的虚拟机的实现》中关于实现一个堆栈虚拟机中附带了汇编器的实现,源码下载地址如下:source code。由于本人对汇编器比较感兴趣,所以对其进行如下剖析。 汇编器主要是一个sasm.c源文件。 其中,一开始定义了一个const char* op_desc[],op_desc是一个数组,其元素类型是const char*,即op_desc是一个字符串数组,其用于存储汇编操作符。 阅读全文

posted @ 2013-10-08 20:22 unixfy 阅读(5914) 评论(0) 推荐(0) 编辑

2013年9月30日

通过前缀表达式计算中缀表达式

摘要: 通过前缀表达式计算中缀表达式 之前我们有讨论《中缀表达式转换为前缀表达式》和《前缀表达式的计算》,通过这两部分,我们可以先将一个中缀表达式转换为前缀表达式,进而利用前缀表达式的计算方法得到前缀表达式的值,也就是中缀表达式的值。 在《中缀表达式转换为前缀表达式》中,我们对中缀表达式的输入是用空白符间隔的,这样对于用户的输入有很大的限制性。我们最理想的情况是用户既可以输入空白符也可以不输入,即根据个人喜好自由输入。典型的方法就是对输入的表示中缀表达式的字符串进行词法分析,解析出对应的中缀表达式,进而进行转换操作和计算。关于中缀表达式的词法分析,我们可以参考《四则运算的词法分析》。 本文我们是将上面 阅读全文

posted @ 2013-09-30 17:15 unixfy 阅读(758) 评论(0) 推荐(0) 编辑

2013年9月28日

中缀表达式转换为前缀表达式

摘要: 中缀表达式转换为前缀表达式 在《前缀表达式的计算》中,我们讨论了对前缀表达式如何计算:设置一个操作数栈,对前缀表达式从右到左扫描,遇到操作数直接入栈,遇到操作符则从操作数栈弹栈,先弹left值后弹right值,根据操作符进行相应的计算,并将计算结果压入到操作数栈中,最终将整个前缀表达式扫面完毕。这时操作数栈中只有一个元素,该元素的值即为前缀表达式的值。 在《中缀表达式转换为后缀表达式》中,我们讨论了如何将一个中缀表达式转换为其对应的后缀表达式。其思想为:设置一个操作符栈,如果遇到操作数,则直接将操作数放进后缀表达式中,如果遇到非操作数,则:如果是左括号,则将左括号入栈;如果是右括号,则从操作符 阅读全文

posted @ 2013-09-28 19:08 unixfy 阅读(15843) 评论(0) 推荐(3) 编辑

导航