程序最美(寻路)

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

09 2013 档案

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

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

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

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

原码•反码•补码
摘要:原码·反码·补码 本文可以说是比较水,主要是谈一下原码、反码、补码的东西。原码、反码、补码的定义我们这里不做介绍,可以Google之,查询相关Wiki或百度百科。 我们主要对一个数,如果转换为原码、反码、补码,并且如何由原码、反码、补码转换为原数。下面我们给出几种转换的代码实现,并对代码做一下解释。 需要说明的是,我们并没有对正数用原码负数用补码进行分开讨论,而是对正负数、无符号数都求了原码、反码、补码。关于原码、反码、补码的内部机制,为什么有产生这些,为什么会用它们,用它们有什么好处,我们也不做介绍,如果感兴趣的话可以参考《深入理解计算机系统》。 我们先给出相关的程序,然 阅读全文

posted @ 2013-09-26 22:43 unixfy 阅读(615) 评论(0) 推荐(0) 编辑

实现一个堆栈虚拟机
摘要:实现一个堆栈虚拟机 本文我们实现一个基于堆栈的虚拟机,通过前面《简单虚拟机》和《栈虚拟机源码剖析》,对虚拟机结构和原理有了更深的理解和体会。下面我们给出堆栈虚拟机的示意图: 堆栈虚拟机主要包括以上三部分:虚拟机、指令集、外部接口。 其中虚拟机内部构造主要是数据、指令、堆栈三部分,指令对数据进行操作,将数据装载进堆栈中以备运算和处理。 指令集的设计可以参考别人的设计也可以按照自己的理解逐步扩充改进,主要有PUSH、POP、TOP、INPUT、OUTPUT、JMP、JMP_TRUE、JMP_FALSE、JMP_EQUAL、JMP_NOT_EQUAL、JMP_BIGGER、JMP_SMALLE... 阅读全文

posted @ 2013-09-25 00:15 unixfy 阅读(4422) 评论(0) 推荐(0) 编辑

栈虚拟机源码剖析
摘要:栈虚拟机源码剖析 之前我们介绍过一个《简单虚拟机》,该虚拟机是基于寄存器的。 本文我们剖析一个栈虚拟机的源代码。该代码来自于《实现一个脚本引擎》中的《Part VII:虚拟机(The Virtual Machine)》,该栈虚拟机的源代码下载地址为:source code。 虚拟机的实现方式有三种:内存、堆栈、寄存器。 该虚拟机主要包含三部分:一个指令数组、一个字符串表、一个堆栈:成员说明指令数组存储程序所包含的指令字符串表实质上是一个指针数组,代表程序的一个变量或者堆栈中的一个临时变量堆栈有整数组成,指向字符串表,以表示什么字符串在堆栈中(这里使用的是整数,而非字符串类的指针);堆栈还... 阅读全文

posted @ 2013-09-23 22:55 unixfy 阅读(1844) 评论(0) 推荐(0) 编辑

前缀表达式的计算
摘要:前缀表达式的计算 前面我们曾对《后缀表达式的计算》做过讨论。后缀表达式的计算过程是首先设定一个操作数栈,顺序扫描整个后缀表达式,如果遇到操作数,则将操作数压栈;如果遇到操作符,则从操作数栈中弹出相应的操作数进行运算,并将运算结果进行压栈。当将整个后缀表达式扫描完毕时,操作数栈中应该只有一个元素,该元素的值即为后缀表达式的计算结果。 对于一个后缀表达式:1 2 3 + - 其对应的前缀表达式为:-1 + 2 3 前缀表达式的计算方法与后缀表达式的计算方法类似。对前缀表达式从后向前扫描,设定一个操作数栈,如果是操作数,则将其直接入栈,如果是操作符,则从栈中弹出操作符对应的操作数进行运算,并将计算结 阅读全文

posted @ 2013-09-22 22:55 unixfy 阅读(12255) 评论(0) 推荐(1) 编辑

ASCII码表以及不同进制间的O(1)转换
摘要:ASCII码表以及不同进制间的O(1)转换 一、ASCII码表 ASCII全称为American Standard Code for Information Interchange,美国信息交换标准代码。其值范围为0-127,总共128个字符。 下面我们对着128个字符进行输出,分为五列:二进制、八进制、十进制、十六进制、字符。具体程序如下:// 生成ASCII码表#include #include #include using namespace std;string IntTo_(int num, int radix, string& ret){ int index = ret.s 阅读全文

posted @ 2013-09-22 21:42 unixfy 阅读(1041) 评论(0) 推荐(1) 编辑

四则运算表达式的语法分析
摘要:四则运算表达式的语法分析 本文参考自vczh的《如何手写语法分析器》。 之前有《语法分析器初步学习——LISP语法分析》也是参考自《如何手写语法分析器》。 通过语法规则表达操作符的优先级。 四则运算表达式的语法为: 1.Term = | “(”Exp”)” 2.Factor = Term ((“*” | “/”) Term)* 3.Exp = Factor ((“+” | “-”) Factor)* 根据语法写代码。这里不对四则运算表达式求值,而是将其转换为等价的Lisp表达式,然后输出。 具体的代码如下:// 四则运算表达式的语法分析——生成LISP表达式#include #include. 阅读全文

posted @ 2013-09-18 23:14 unixfy 阅读(2991) 评论(0) 推荐(0) 编辑

语法分析器初步学习——LISP语法分析
摘要:语法分析器初步学习——LISP语法分析 本文参考自vczh的《如何手写语法分析器》。 LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)(+ 3 4)),1 + 2会写成(+ 1 2)。 LISP语言的语法如下形式:1.Operator = “+” | “-” | “*” | “/” 2.Expression = | ”(”Expression”)” | “(”Operator Expression Expression”)” 我们根据以上两条语法规则来写代码:// LISP语法分析器#include #include using names. 阅读全文

posted @ 2013-09-15 21:58 unixfy 阅读(2411) 评论(0) 推荐(0) 编辑

ASC与HEX之间的转换
摘要:ASC与HEX之间的转换 有这么两个函数:函数原型功能返回值参数备注hex2asc__int16 hex2asc(unsigned char *strhex,unsigned char *strasc,__int16 length);字符串转换函数,十六进制字符转换成普通字符成功则返回 0,否则返回非0strhex:要转换的字符strasc:转换后的字符length:字符strasc的长度长转短asc2hex__int16 asc2hex(unsigned char *strasc,unsigned char *strhex,__int16 length);字符串转换函数,普通字符转换成十六进 阅读全文

posted @ 2013-09-14 14:40 unixfy 阅读(10845) 评论(1) 推荐(0) 编辑

字节存储数据
摘要:字节存储数据 一个字节有8个bit,一个int一般情况下有32个bit(4个字节),一个long有64个bit(8个字节)。 对于一个数据:0123456789 我们可以用10个int来存储,共占用40个字节。如果用10个long来存储,则共占用80个字节,如果用10个char来存储,则共占用10个字节。 int有32个bit,其表示范围为2^(-31)~2^31-1 long有64个bit,其表示范围为2^(-63)~2^63-1 char有8个bit,其表示范围为2^(-7)~2^7-1,如果是unsigned char,其表示范围为0~2^8-1 显然int、long、char的表示能力 阅读全文

posted @ 2013-09-12 22:06 unixfy 阅读(1612) 评论(0) 推荐(0) 编辑

进制之间的转换
摘要:进制之间的转换一、谈谈几个库函数函数原型功能参考atoiint atoi(const char* nptr);把字符串换化成整型数百度百科itoachar* itoa(int value, char* string, int radix);将整型数转换为radix进制数的字符串形式百度百科atollong atol(const char* nptr);把字符串转换成长整型数百度百科atofdouble atof(const char* nptr);把字符串转换成浮点数百度百科strtoddouble strtod(const char* nptr, char** endptr);把字符串转换成 阅读全文

posted @ 2013-09-12 16:42 unixfy 阅读(759) 评论(0) 推荐(0) 编辑

参数解析
摘要:参数解析 一函数传递的参数为以字符串,其具体格式是用”$”和”|”来间隔文件名和数据项名,我们的工作时将参数字符串进行解析,得到一个个具体的文件名-数据项的形式。 我们可以采用顺序扫描的方法进行解析,也可以利用状态转换图进行解析。 字符串的格式为:文件之间用”$”来间隔,数据项之间用”|”来间隔。 例如:A|01|02|03|04|05|$B|01|02|03|$C|01|09|$ 该字符串指明了四个文件:A、B、C、D,其中,A文件的数据项为01、02、03、04、05,B文件的数据项为01、02、03,C文件的数据项为01、09。 我们是想得到如下的结果: A 01 A 02 A 03 A 阅读全文

posted @ 2013-09-11 10:37 unixfy 阅读(1007) 评论(0) 推荐(0) 编辑

自动机专题
摘要:自动机专题http://zhidao.baidu.com/question/534740975.html这里是针对注释、标识符、实常数的识别,各实现一个有穷状态自动机。其实,可以将注释、标示符、实常数三个有穷状态自动机合并成一个自动机,将三种情况下的状态进行合并,针对每种状态在各种字符的条件下进行相关判断(case…)。即可完成统一的有穷状态自动机的实现。附:豆瓣上关于有穷状态自动机的介绍:http://www.douban.com/note/74804011/http://zh.wikipedia.org/wiki/%E8%87%AA%E5%8A%A8%E6%9C%BA%E7%BC%96%E 阅读全文

posted @ 2013-09-04 15:44 unixfy 阅读(583) 评论(0) 推荐(1) 编辑

导航

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