程序最美(寻路)

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

随笔分类 -  四则运算

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

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

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

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

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

posted @ 2013-09-22 22:55 unixfy 阅读(12425) 评论(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 阅读(3056) 评论(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 阅读(2594) 评论(0) 推荐(0)

代数表达式的四则运算
摘要:代数表达式的四则运算 前面我们讨论了四则运算的相关情形,对于给定的中缀表达式,我们对其进行词法分析、中缀转后缀、后缀计算等过程,最终得到中缀表达式的值。 在我们输入的中缀表达式中,我们对于每个操作数都是已知的值,不存在未知量。 而在本文中,我们是重点讨论有关中缀表达式中存在未知量的情形,我们将含有未知量的表达式称作为代数表达式。 比如给定一代数表达式:a+b-c/d*xyz 该表达式中存在5个未知量:a、b、c、d以及xyz。我们的处理过程还是按照以前处理四则运算的情形那样,首先对输入的代数表达式进行词法分析,得到想要的操作符、已知量、未知量等。然后将中缀表达式转换为后缀表达式,最后在进行后缀 阅读全文

posted @ 2013-08-22 01:33 unixfy 阅读(1243) 评论(0) 推荐(0)

后缀表达式转换为中缀表达式
摘要:后缀表达式转换为中缀表达式 之前我们介绍过《中缀表达式转化为后缀表达式》,现在我们想得到其逆过程,即如何由后缀表达式转换为中缀表达式。 目前我先给出我的一种理解和实现,其他方法以后再议。 有关中缀表达式的词法分析,本文不作考虑,而是直接用加了空格硬分割操作符和操作数的后缀表达式。 我们先来回忆一下后缀表达式的计算方法,可参考《后缀表达式的计算》。后缀表达式的计算过程为:首先设置一个操作数栈,对后缀表达式进行从左到右的扫描,如果是操作数,则直接压栈,如果是操作符,则从操作数栈中弹出相应的操作数结合当前操作符进行相应的运算,后将运算而得的结果压入到栈中,直至扫描完整个栈后,如果该中缀表达式是合法的 阅读全文

posted @ 2013-08-19 22:38 unixfy 阅读(7998) 评论(1) 推荐(2)

基于词法分析的中缀表达式计算
摘要:基于词法分析的中缀表达式计算 前面我们对中缀表达式的词法处理进行了讲解并给出了程序示例《四则运算的词法分析》,之前我们也对中缀表达式的计算进行了一系列的分析,诸如《检测中缀表达式的合法性》。在之前的中缀表达式的计算中,我们是利用了空白符来间隔操作符和操作数,这属于一种硬分割。 本文我们利用上一篇中对中缀表达式进行词法分析,进而通过中缀表达式转换为后缀表达式,进而计算后缀表达式来实现基于词法分析的中缀表达式计算。 程序的处理过程主要是包括3个部分: 1.对中缀表达式进行词法分析 2.中缀表达式转化为后缀表达式 3.后缀表达式的计算 我们的程序也是按照以上三个步骤进行的,具体的程序如下:// 基于 阅读全文

posted @ 2013-08-16 13:16 unixfy 阅读(635) 评论(0) 推荐(0)

四则运算的词法分析
摘要:四则运算的词法分析 之前我们处理四则运算的方法有两种,第一种是对输入的格式强制限定运算符两边都有空白符,另一种是我们根据输入的字符串,对其中的运算符进行添加空白符预处理。通过添加空白符进行处理里显然不太规范和方便,真正需要做的应该是我们对输入的四则运算表达式进行词法分析,解析出相应的运算符和操作符,然后在进行中缀转后缀、后缀表达式的计算等过程。 我们的四则运算表达式只包含两种元素:操作符和操作数。 其中,操作符目前限定为+、-、*、/四种,另外还有括号:左括号和右括号。 操作数可以是小数也可以是整数。 操作符和操作数我们将其视为token,其对应的种别码分别为:tokenid+1-2*3/4( 阅读全文

posted @ 2013-08-16 11:02 unixfy 阅读(2249) 评论(0) 推荐(0)

检测中缀表达式的合法性
摘要:检测中缀表达式的合法性 前面我们对《中缀表达式的计算》以及《检测后缀表达式的合法性》进行了讨论,这里我们借助于之前对于两者的讨论,来对中缀表达式的合法性进行检测。如果中缀表达式是合法的,则返回该表达式的值;如果是非法的,则提示其非法。 我们对中缀表达式的合法性检测主要分为两个阶段: 1)中缀表达式转换为后缀表达式过程中是否存在错误; 2)后缀表达式的计算过程中是否存在错误 其中,第2阶段我们在《中缀表达式的计算》中已经做过讨论,这里重点在于第1阶段。 在第1阶段中主要涉及以下几个合法性检测: .操作数是否合法; .左括号和右括号是否匹配; 一、操作数是否合法 合法的操作数首个字符可以是“+”、 阅读全文

posted @ 2013-08-03 00:17 unixfy 阅读(4661) 评论(0) 推荐(2)

!勘误!之前中缀转后缀的一处错误
摘要:!勘误!之前中缀转后缀的一处错误 之前我们在中缀转后缀的处理过程中对于当操作符为”)”的时候,对操作符栈进行弹栈操作,当操作符栈的top()值为”(”,我们将其从操作符栈中进行弹出,但是并没有终止,而是继续弹栈,这是一个严重的错误。比如对于表达式:4 - ( 3 + 2 ) / ( 3 - 1 ) 我们按照之前的做法得到的结果为: 0.5 但是,正确的结果应该为1.5 具体错误出现在: 我们在当if (op_st.top() == “(”) po_st.pop() 后没有结束while循环,从而导致操作符内所有的操作符都弹栈。 具体的修改方法是在op_st.pop()后面添加一个break;语 阅读全文

posted @ 2013-08-01 00:04 unixfy 阅读(307) 评论(0) 推荐(0)

检测后缀表达式的合法性
摘要:检测后缀表达式的合法性 前面我们介绍了《后缀表达式的计算》,具体做法在于设置一个数据结构:操作数栈,基于操作数栈根据操作符进行弹栈、运算、压栈等操作,最终计算而得后缀表达式的结果。 我们默认处理的后缀表达式都是合法的,对于非法的后缀表达式,我们并没有给出适当的处理。这里我们将在后缀表达式的计算过程中,同时检测后缀表达式是否合法,如果合法则计算到底,最终得到后缀表达式的值;如果非法,则返回该后缀表达式为非法。 比如有后缀表达式: 2 + 3 * 该后缀表达式是非法的,因为+操作符只有一个操作数2; 又如: 1 3 5 * + 7 / - 该后缀表达式的/操作符只有一个操作数7,所以也是非法的; 阅读全文

posted @ 2013-07-31 23:24 unixfy 阅读(2478) 评论(0) 推荐(0)

对表达式进行空白符预处理
摘要:对表达式进行空白符预处理 前面我们关于中缀表达式、后缀表达式的输入默认是按照操作符和操作数之间是有空白符区分的,所谓的空白符即为空格或者制表符,不包括换行符。// 表达式中操作符和操作数之间默认有空白符void get_infix(vector& inf){ inf.clear(); string line; getline(cin, line); istringstream sin(line); string tmp; while (sin >> tmp) { inf.push_back(tmp); }} 我们这里针对输入表... 阅读全文

posted @ 2013-07-19 12:38 unixfy 阅读(334) 评论(0) 推荐(0)

中缀表达式的计算
摘要:中缀表达式的计算 前面我们分别讨论了《中缀表达式转换为后缀表达式》以及《后缀表达式的计算》,将二者合并一起即为中缀表达式的计算。即中缀表达式的计算包含两个过程: 1)中缀表达式到后缀表达式的转换 2)后缀表达式的计算 其中,第一个过程是用到了一个栈,该栈存储操作符,即为操作符栈。顺序扫描整个中缀表达式,如果是操作数直接存入后缀表达式中,如果是操作符,则根据其优先级进行入栈出栈操作,具体细节可参见《中缀表达式转换为后缀表达式》。 第二个过程也用到了一个栈,该栈存储操作数,即为操作数栈。其过程是从左到右顺序扫描整个后缀表达式,如果是操作数,则直接入栈,如果是操作符,则对栈中操作数进行弹栈操作,并对 阅读全文

posted @ 2013-07-17 00:33 unixfy 阅读(1921) 评论(0) 推荐(1)

后缀表达式的计算
摘要:后缀表达式的计算 对后缀表达式进行计算,得到表达式的值。 例如有后缀表达式:2 1 + 3 * 其结果应为: 9 后缀表达式: 1 3 5 * + 7 9 / - 其结果应为:15.222 后缀表达式: 1 3 + 5 7 - * 9 / 其结果应为: -0.889 后缀表达式计算程序如下:// 后缀表达式的计算#include #include #include #include #include #include using namespace std;void get_postfix(vector& postf){ postf.clear(); string line; ... 阅读全文

posted @ 2013-07-17 00:02 unixfy 阅读(4251) 评论(0) 推荐(1)

中缀表达式转换为后缀表达式
摘要:中缀表达式转换为后缀表达式 首先何为中缀表达式。中缀表达式就是我们最为常见的算术表达式形式,即操作符在操作数中间。比如 3 + 4。 后缀表达式是将操作符置于操作数后面,即如下形式:3 4 +。 给定一个中缀表达式,我们如何将其转换为后缀表达式? 我们这里涉及的操作符只局限于加、减、乘、除四种运算,即四则运算,外加括号功能。 比如给定一个中缀表达式:1 + 3 * 5 – ( 7 / 9 ) 其后缀表达式应为:1 3 5 * + 7 9 / - 中缀表达式: ( 1 + 3 ) * ( 5 – 7 ) / 9 其后缀表达式为: 1 3 + 5 7 - * 9 / 我们先给出其程序实现如下:// 阅读全文

posted @ 2013-07-15 23:46 unixfy 阅读(5512) 评论(0) 推荐(0)

导航