- 浏览: 289834 次
- 性别:
- 来自: 龙城
最新评论
-
redey:
这垃圾东西,1.6以上JDK不支持
Jocky混淆JAVA代码(保护你的JAVA项目) -
u012907473:
水电费是否是否
js页面缓存的一个解决办法 -
jackson200:
讲解的很详细!
Jocky混淆JAVA代码(保护你的JAVA项目) -
jamesqq79:
下载解压缩后,不知是何文件格式,用PDF阅读器打不开。
Java程序员的推荐阅读书籍之十《Agile Java》 -
meimei727:
<!-- 给页面文件中的js和css引用增加版本号 -- ...
利用ant进行项目发布
近期,需要用javascript实现算术表达式的解析,在网上查了一下,逆波兰表达式是最简单快捷的一种。
逆波兰表达式
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 写成什么呢?
http=smtp,http,telnet,+,+,1024,/
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
下面是程序化算法流程:
1、建立运算符栈stackOperator用于运算符的存储,压入'\0'。
2、预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号) 。
3、顺序扫描表达式,如果当前字符是数字(优先级为0的符号),则直接输出该数字;如果当前字符为运算符或括号(优先级不为0的符号),则判断第4点 。
4、若当前运算符为'(',直接入栈;
若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出;
若为其它,比较stackOperator栈顶元素与当前元素的优先级:
如果 栈顶元素 >= 当前元素,出栈并顺序输出运算符直到 栈顶元素 < 当前元素,然后当前元素入栈;
如果 栈顶元素 < 当前元素,直接入栈。
5、重复第3点直到表达式扫描完毕。
6、顺序出栈并输出运算符直到栈顶元素为'\0'。
各运算符及符号优先级:
'\0': -1
')': 1
'(': 2
'+'、'-': 3
'*'、'/'、'%': 4
'^': 5
其它: 0
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 写成什么呢?
http=smtp,http,telnet,+,+,1024,/
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
下面是程序化算法流程:
1、建立运算符栈stackOperator用于运算符的存储,压入'\0'。
2、预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号) 。
3、顺序扫描表达式,如果当前字符是数字(优先级为0的符号),则直接输出该数字;如果当前字符为运算符或括号(优先级不为0的符号),则判断第4点 。
4、若当前运算符为'(',直接入栈;
若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出;
若为其它,比较stackOperator栈顶元素与当前元素的优先级:
如果 栈顶元素 >= 当前元素,出栈并顺序输出运算符直到 栈顶元素 < 当前元素,然后当前元素入栈;
如果 栈顶元素 < 当前元素,直接入栈。
5、重复第3点直到表达式扫描完毕。
6、顺序出栈并输出运算符直到栈顶元素为'\0'。
各运算符及符号优先级:
'\0': -1
')': 1
'(': 2
'+'、'-': 3
'*'、'/'、'%': 4
'^': 5
其它: 0
/** * 计算逆波兰表达式的值 */ function calculate(RPolishArray){ var result = 0; var tempArray = new Array(100); var tempNum = -1; for(i = 0;i < RPolishArray.length;i++){ if(RPolishArray[i].match(/\d/)){ tempNum++; tempArray[tempNum] = RPolishArray[i]; }else{ switch(RPolishArray[i]){ case '+': result = (tempArray[tempNum-1] *1) + (tempArray[tempNum] * 1); tempNum--; tempArray[tempNum] = result; break; case '-': result = (tempArray[tempNum-1] *1) - (tempArray[tempNum] * 1); tempNum--; tempArray[tempNum] = result; break; case '*': result = (tempArray[tempNum-1] *1) * (tempArray[tempNum] * 1); tempNum--; tempArray[tempNum] = result; break; case '/': result = (tempArray[tempNum-1] *1) / (tempArray[tempNum] * 1); tempNum--; tempArray[tempNum] = result; break; } } } result = tempArray[tempNum]; return result; } /** * 把普通算术表达式转换为逆波兰表达式 */ function toRPolish(input){ var regex = /(\(|\)|\+|\-|\*|\/)+/; var array = input.split(regex); var RPolish = "" var isI = false; num = 0; var SymbolArray = new Array(100); var SymbolNum = -1; for(j = 0;j < input.length;j++){ if(input.charAt(j).match(/\d/)){ if(isI == false){ RPolish += ',' RPolish += array[num]; num++; isI = true; } } else{ if(SymbolNum == -1){ SymbolNum++; SymbolArray[SymbolNum] = input.charAt(j); }else{ if(input.charAt(j).match(/\(/) || SymbolArray[SymbolNum].match(/\(/)){ SymbolNum++; SymbolArray[SymbolNum] = input.charAt(j); }else if(input.charAt(j).match(/\)/)){ while(!SymbolArray[SymbolNum].match(/\(/)){ RPolish += ','; RPolish += SymbolArray[SymbolNum]; SymbolNum--; } SymbolNum--; }else if(compare(input.charAt(j),SymbolArray[SymbolNum])){ SymbolNum++; SymbolArray[SymbolNum] = input.charAt(j); }else if(!compare(input.charAt(j),SymbolArray[SymbolNum])){ RPolish += ','; RPolish += SymbolArray[SymbolNum]; SymbolNum--; if(SymbolNum >= 0){ if(SymbolArray[SymbolNum].match(/\(/)){ SymbolNum++; SymbolArray[SymbolNum] = input.charAt(j); }else if(!compare(input.charAt(j),SymbolArray[SymbolNum])){ RPolish += ','; RPolish += SymbolArray[SymbolNum]; SymbolArray[SymbolNum] = input.charAt(j); }else{ SymbolNum++; SymbolArray[SymbolNum] = input.charAt(j); } }else{ SymbolNum++; SymbolArray[SymbolNum] = input.charAt(j); } } } isI = false; } } while(SymbolNum >=0){ RPolish += ','; RPolish += SymbolArray[SymbolNum]; SymbolNum--; } regex = /,/; var RPolishArray = RPolish.split(regex); return RPolishArray; } function compare(a,b){ if((a.match(/\*/)||a.match(/\//))&&(b.match(/\+/)||b.match(/\-/))){ return true; }else{ return false; } }
- 表达式求值(逆波兰算法,javascript实现).rar (1.3 KB)
- 下载次数: 111
发表评论
-
autochk program not found 蓝屏重启问题解决
2012-04-17 10:54 13841起因: 因为硬盘空间不够,所以把原来的双系统中的ubu ... -
IOS开发一些资源
2012-02-06 16:07 1365从别的地方看到的,多谢作者,现贴在这里备忘。 在线教程 ... -
发现一个好东东,可以让浏览器跟本地桌面交互,哈哈
2011-09-08 17:35 1248http://gears.google.com/ -
nodejs开发运行环境搭建
2011-08-18 15:03 4403一. geddy 开发运行环境搭建 geddy是基 ... -
javascript来势凶猛
2011-08-15 17:22 1215引子 java编程弄了7,8个年头了,也 ... -
Oracle驱动包装
2011-07-06 17:06 2036见附件。 -
javaeye域名变了
2011-04-01 10:31 1280javaeye域名变了,才发现,哈哈,mark下。 -
拥抱敏捷
2011-01-15 17:27 1100前言 有关项目管理和软件开发方 ... -
重温设计模式
2011-01-13 10:27 1165策略模式: 定义了算 ... -
jsoup,html解析的利器
2011-01-07 09:21 1208http://jsoup.org/download -
关于html表格复制到excel
2010-09-09 14:04 5875刚才一个朋友问我这个事情,我拍脑袋想了一下,给他答复不可能,因 ... -
Java 路径 System.getProperty("key")的参数key
2010-09-02 14:37 1289java.version ... -
这种需求,大家看看有没有比较好的解决方案
2010-06-25 09:47 2345在我们的应用中,碰到了如图所示的一种网络结构。 重新描 ... -
java中singleton的几种实现方式
2010-06-24 15:08 1476传统的最简单的方式 这种模式有一个缺点就是不能实现延 ... -
oracle分页查询数据重复问题的解决
2010-06-24 11:00 3429在oracle分页查询中,我们采用类似以下所示的公认的比较高效 ... -
ubuntu10.04中安装使用IE6
2010-06-21 09:55 2598在用ubuntu910的时候,已经装了一遍IE了,但是升级到1 ... -
今天发现的两个有价值的东东
2010-06-17 15:45 1520其一,iRedMail,开源邮件解决方案。 其 ... -
ubuntu 10.04 中安装mysql5.1.4
2010-06-17 15:28 1837自从升级到10.04以后,mysql就不正常,卸载装了n次,均 ... -
升级到ubuntu 10.04,wine中的ie不正常了
2010-06-11 10:01 1708ubuntu上也折腾了半年了,日常工作生活基本没有太多的障碍了 ... -
升级到ubuntu10.04,mysql不能用了
2010-06-11 09:53 18789.10版本用了半年了,10.04发布了,看了10.04的宣传 ...
相关推荐
程序会使用正则表达式解析这个表达式,将之转化为逆波兰表达式。这涉及到识别数字、运算符,并处理运算符的优先级。 2. **逆波兰表达式生成**:在解析过程中,每个运算符和数字会被依次压入栈中。遇到运算符时,会...
在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析。 一、熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, ...
计算器Javascript的数学表达式解析器。 可在微信小程序中使用支持IE9 + 支持AMD / CommonJS 支持定制运营商支持自定义功能您可以使用util将数学表达式解析为反向波兰表示法或对其求值。例如,当解析1+2*3 ,您将获得...
在计算机科学中,算术表达式求值是一个基础但至关重要的任务,它涉及到解析、处理和计算数学表达式。这个过程通常分为两个主要步骤:解析(parsing)和求值(evaluation)。以下将详细讲解这两个步骤以及相关技术。 ...
在JavaScript中实现一个能够对算术表达式求值的计算器是一项常见的编程练习...以上就是JavaScript实现算术表达式计算器功能的主要知识点,实际实现时还需要考虑错误处理、用户输入验证等方面,以提供更完善的用户体验。
在这个名为“taw-datastructure”的项目中,我们关注的是一个计算器应用,它不仅能求解算术表达式,还能展示分析树(也称为语法树),这是理解计算过程的一种可视化方式。这个项目是“每周一次”挑战的产物,目标是...
这种表示法在编程语言中被广泛用于解析和执行算术表达式,尤其在编译器和解释器的设计中。 RPM.js 是一个JavaScript库,它提供了一个自定义的逆波兰表示法解释器,允许开发者在JavaScript环境中处理和计算逆波兰...
这可能涉及到逆波兰表示法(Reverse Polish Notation,RPN)或者使用栈数据结构来解析和计算表达式。 在实现计算器的过程中,我们还需要关注用户界面的更新。每次按键或运算后,结果应实时显示在屏幕上。这可以通过...
例如,逆波兰表示法(Postfix Notation)是一种后缀表达式求值的方法,它消除了括号的需要,通过堆栈处理运算顺序。 2. **深度优先遍历(Depth-First Search, DFS)**:在树或图结构中,通过递归或栈来遍历节点,...
calc.js,它直接计算标准算术表达式 calcAST.js 的值,它根据抽象语法树生成中间表示,并具有两个计算函数——一个用于从 AST 计算表达式的值,另一个用于计算表达式的值将表达式转换为波兰语符号。 这是解析器...
这涉及到表达式解析,可能使用栈数据结构实现逆波兰表示法(RPN,Reverse Polish Notation)来解析和计算表达式。另一种方法是使用现成的解析库,如JavaScript的`math.js`库,它可以解析和计算数学表达式。 4. **...
这些测试用例可能包括简单的算术表达式、具有复杂运算符顺序的表达式,以及边缘和异常情况。编写单元测试和集成测试是确保程序质量的重要步骤。 总结来说,创建一个能处理加减乘除字符串的计算器涉及了字符串解析、...
这个过程称为后缀表达式(也叫逆波兰表示法)或中缀表达式到后缀表达式的转换,它可以帮助简化计算过程。 此外,JavaScript的`eval`函数虽然可以简单地计算一个包含数学表达式的字符串,但考虑到安全性和性能,通常...
这通常涉及创建一个解析和执行表达式的方法,可能涉及到逆波兰表示法(RPN)或堆栈数据结构来处理运算符和操作数。 6. **错误处理**:一个健壮的计算器应用程序还需要考虑错误处理,比如除数为零、非法字符输入等...
3. **表达式解析**:对于更复杂的计算器,可能会处理中缀(infix)或后缀(postfix,也称为逆波兰表示法)表达式。中缀表达式是我们常见的运算符位于操作数之间的形式,而后缀表达式则将运算符放在操作数之后,通常...
这通常通过逆波兰表示法(Reverse Polish Notation, RPN)或堆栈算法实现,将中缀表达式转化为后缀表达式,然后进行计算。 3. 错误检查:在计算过程中,程序需要检查除数是否为零,以及其他可能的语法错误。如果...
- **Java**:Java中的`Scanner`类用于获取用户输入,然后结合运算符和表达式解析来完成计算。 - **JavaScript**:在网页环境中,JavaScript可以捕获用户输入,利用`prompt`或HTML表单,然后通过函数实现计算逻辑。...
- **括号匹配**:计算器的核心是正确处理括号内的表达式,这通常通过前缀、后缀或中缀表达式(逆波兰表示法)等方法实现。在中缀表达式中,需要识别并处理括号优先级,确保正确的计算顺序。 - **操作符优先级**:...
计算器的核心算法可能涉及到栈(stack)数据结构,因为计算器的运算遵循后缀表达式(逆波兰表示法)原则。当用户按下运算符时,我们将操作数压入栈中,直到遇到另一个运算符或等号。在等号被点击时,栈中的操作数和...