RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript
1、利用栈(Stack)来存储操作数和操作符;
2、包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点;
2.1、将输入字符串转为数组;
2.2、对转换来的字符进行遍历;创建一个数组,用来给存储转换为后缀表达式的字符;创建一个栈,用来存储操作符;
2.3、通过正则来过滤,为数字的则放在数组中,其他的则放在栈中;
2.4、接下来是最麻烦的操作符判断,我做的这个比较简单,如果再复杂些,我这个可能还要进行扩展或优化;
2.5、对操作符的判断按照其优先级来,首先是括号,有‘(’,直接压人,等到有‘)’的时候再一个个的将括号内的操作符进行弹出,如果里面有两个以上,则要先弹
靠近‘(’的;
2.6、然后是乘除。这里,我将乘除的弹栈放在了它的入栈前面,两则并不冲突,也不会对其他操作符有影响,因为它在添加数字的时候,就把乘或除弹出来了添加到数组;
2.7、上一个乘或除已经被弹出去了,数字添加后,如果后面字符是乘或除,则就直接入栈。(比如测试testing中的第一字符串,有连个两个乘);
2,8、最后是加减。首先,如果是空栈,直接入栈,如果不是空栈,则判断栈顶是否有‘(’,有则直接入栈,如果栈顶这些情况都没有(前面已经经乘除考虑了,这里就无需考虑了),
则说明栈内都是加或减,这时可以
将栈顶元素弹栈,并添加到数组中,再将当前操作符入栈。
3、包含后缀表达式的计算方式;
4、利用主函数main来调用;
5、cmd测试。
function Stack(){
this.store = [];
this.top = 0;
this.push = push;
this.pop = pop;
}
function push(ele){
this.store[this.top++] = ele;
}
function pop(){
var top = --this.top;
if(top >= 0){
var val = this.store[top];
//-----------------务必删除弹出栈的值原来的空间----------------------------
this.store.splice(this.top,1);
return val;
}else{
return 'It\' Ending !';
}
}
//----------------中缀表达式转后缀表达式-----------------------------------
function normalChar(normalC){
normalC = normalC.split(' ');
var arr = [];
var ls = new Stack();
var reg = /\d/;
for(var i=0; i<normalC.length; i++){
if(reg.test(normalC[i])){
arr.push(normalC[i]);
}
if(normalC[i] == '('){
ls.push(normalC[i]);
}
else if(normalC[i] == ')'){
while(ls.store[ls.top-1] != '('){
arr.push(ls.pop());
}
ls.pop();
}
//-----------------此处是在添加数字的时候进行的,不会和其他操作符发生冲突--
else if(ls.store[ls.top-1] == '*' || ls.store[ls.top-1] =='/'){
arr.push(ls.pop());
}
else if(normalC[i] == '*' || normalC[i] =='/'){
ls.push(normalC[i]);
}
else if(normalC[i] == '+' || normalC[i] =='-'){
if(ls.top == 0){
ls.push(normalC[i]);
}
else if(ls.top > 0){
if(ls.store[ls.top-1] == '('){
ls.push(normalC[i]);
}else{
arr.push(ls.pop());
ls.push(normalC[i]);
}
}
}
}
while(ls.store != 0){
arr.push(ls.pop());
}
return arr;
console.log(arr);
}
//------------------------Testing---------------------------------------
function main(){
//输入时做提示,以空格间隔每个操作符和操作数
//var normalC = ' 1 - ( 2 + 3 ) * 4 * 2 + 10 / 5 ';
var normalC = '2 + 3 * 4 * ( 3 - 2 )';
var stack = new Stack();
var char = normalChar(normalC);
var p = 0,s = 0;
var reg = /\d/;
for(var i=0; i<char.length; i++){
if(reg.test(char[i])){
stack.push(char[i]);
}else{
switch(char[i]){
case '-':
p = stack.pop();
s = stack.pop();
stack.push(Number(s)-Number(p));
break;
case '+':
p = stack.pop();
s = stack.pop();
stack.push(Number(s)+Number(p));
break;
case '*':
p = stack.pop();
s = stack.pop();
stack.push(Number(s)*Number(p));
break;
case '/':
p = stack.pop();
s = stack.pop();
if(p != 0){
stack.push(Number(s)/Number(p));
}else{
console.log("除数不能为0");
break;
}
}
}
}
console.log(stack.store);
}
main();
RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript的更多相关文章
- 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式
直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...
- C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)
1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...
- 栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)
一.前言 普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...
- hdu-1237 简单计算器---中缀表达式转后缀表达式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...
- .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)
最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如: (1)将 ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- 怎么实现Linux下的逆波兰计算器dc?
#返回上一级 @Author: 张海拔 @Update: 2014-01-12 @Link: http://www.cnblogs.com/zhanghaiba/p/3516660.html /* * ...
- 中缀表达式转后缀表达式(Java代码实现)
后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
随机推荐
- 类加载机制(深入理解JAVA虚拟机学习笔记)
1.类加载机制的定义 将class文件加载到内存,然后对class文件中的数据进行校验.解析和初始化,转换成可以被虚拟机直接使用的JAVA类型,这就是虚拟机的类加载机制.(在JAVA中,类的加载.连接 ...
- git无法定位程序输入点libiconv
使用git clone时,报以下错误: 解决方案: 将git\bin\下的libiconv-2.dll复制到\git\libexec\git-core\下即可
- python之路4
迭代器&生成器 迭代器: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后 ...
- Using Call_Form in Oracle D2k
Using Call_Form in Oracle D2k CALL_FORM examples/* Example 1:** Call a form in query-only mode.*/BEG ...
- PHPExcel对于Excel中日期和时间类型的处理
PHPExcel是一款优秀的处理Excel文件读写的开源PHP Library,能够给我们提供强大的Excel读写能力,本文针对Excel处理过程中关于日期和时间类型的处理进行深入的讨论.PHPExc ...
- log4net一些配置说明
<configuration> <configSections> <section name="log4net" type="System. ...
- SQL知识整理三:变量、全局变量、视图、事务、异常
变量 1.局部变量的声明(一个@) declare @n int --声明变量关键字为declare 然后@加变量名 后面是变量类型 declare @s varchar(36) 2 ...
- char.js
轻量级前端画图js框架 此文档包含了用Chart.js创建漂亮图表的所有知识. http://www.bootcss.com/p/chart.js/docs/ 中文文档
- 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
- JavaScript中的编码函数
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...