常见的算术表达式,称为中缀表达式,例如:

5 + ( 6 – 4 / 2 ) * 3

波兰表达式也称为前缀表达式,以上面的例子为例,其波兰表达式为:

+ 5 * - 6 / 4 2 3

波兰表达式

中缀表达式转换前缀表达式的操作过程为:

(1)首先设定一个操作符栈,从右到左顺序扫描整个中缀表达式:

  • 如果是操作数,则直接归入前缀表达式;
  • 如果是括号:如果是右括号,则直接将其入栈;如果是左括号,则将栈中的操作符依次弹栈,归入前缀表达式,直至遇到右括号,将右括号弹栈,处理结束;
  • 如果是其他操作符,则检测栈顶操作符的优先级与当前操作符的优先级关系,如果栈顶操作符优先级大于当前操作符的优先级,则弹栈,并归入前缀表达式,直至栈顶操作符优先级小于等于当前操作符优先级,这时将当前操作符压栈。

(2)当扫描完毕整个中缀表达式后,检测操作符栈是否为空,如果不为空,则依次将栈中操作符弹栈,归入前缀表达式。

(3)最后,将前缀表达式翻转,得到中缀表达式对应的前缀表达式。

波兰表达式计算

  1. 对前缀表达式从后向前扫描,设定一个操作数栈,如果是操作数,则将其直接入栈。
  2. 如果是操作符,则从栈中弹出操作符对应的操作数进行运算,并将计算结果压栈。
  3. 直至从右到左扫描完毕整个前缀表达式,这时操作数栈中应该只有一个元素,该元素的值则为前缀表达式的计算结果。

逆波兰表达式

逆波兰表达式也称为后缀表达式,以上面的例子为例,其逆波兰表达式为:

5 6 4 2 / - 3 * +

中缀表达式转换后缀表达式的操作过程为:

(1)自右向左顺序扫描整个中缀表达式;

  • 如果当前元素为操作数,则将该元素直接存入到后缀表达式中;
  • 如果当前元素为“(”,则将其直接入栈;如果为“)”,则将栈中的操作符弹栈,并将弹栈的操作符存入到后缀表达式中,直至遇到“(”,将“(”从栈中弹出,并不将其存入到后缀表达式中;
  • 如果是其他操作符,如果其优先级高于栈顶操作符的优先级,则将其入栈,如果是小于或低于栈顶操作符优先级,则依次弹出栈顶操作符并存入后缀表达式中,直至遇到一个栈顶优先级小于当前元素优先级时或者栈顶元素为“(”为止,保持当前栈顶元素不变,并将当前元素入栈;

(2)当扫描完毕整个中缀表达式后,检测操作符栈是否为空,如果不为空,则依次将栈中操作符弹栈,归入后缀表达式。

var symbol=['#','(','+','-','*','/',')'];
var symbolPriority={'#': 0,'(': 1,'+': 2,'-': 2,'*': 3,'/': 3,')': 4
}function operaSymbol(char,sym,res){let lastChar=sym[sym.length-1];if(!lastChar){sym.push(char);}if(char==='('){sym.push(char);}else if(char===')'){let currChar=sym.pop();while(sym&&currChar!=='('){res.push(currChar);currChar=sym.pop();}}else if(symbolPriority[char]>symbolPriority[lastChar]){sym.push(char);}else if(symbolPriority[char]<=symbolPriority[lastChar]){while(lastChar&&(symbolPriority[char]<=symbolPriority[lastChar])){let currChar=sym.pop();res.push(currChar);lastChar=sym[sym.length-1];}sym.push(char);}
}function toSuffixExpre(str){let res=[];let sym=[];// 用于记录数字let substr='';//数字>=10时遍历会记为两个数字for(let i=0;i<str.length;i++){// 判断是否是符号if(symbol.includes(str[i])){res.push(substr);substr='';operaSymbol(str[i],sym,res);}else{substr+=str[i];}}res.push(substr);while(sym.length>0){let currChar=sym.pop();res.push(currChar);}let result=res.join(' ');return result;
}var test1 = '1+(2-3)*4+10/5'
console.log('the success is 1 2 3 - 4 * + 10 5 / +')
var result1 = toSuffixExpre(test1)
console.log(result1)
var test2 = 'A+(B-C/D)*E'
console.log('the success is ABCD/-E*+')
var result2 = toSuffixExpre(test2)
console.log(result2)

逆波兰表达式计算

  1. 从左到右顺序扫描整个后缀表达式;
  2. 如果是操作数,则将该操作数压入到栈中;
  3. 如果是操作符,则从栈中弹出对应的操作数,注意操作数的顺序;根据操作符进行运算,并将结果重新压入到栈中;
  4. 直至将整个栈扫描完毕;
  5. 如果后缀表达式是合法的,则扫描完毕后,栈中只有一个元素,该元素的值即为后缀表达式的结果。
/*** @param {string[]} tokens* @return {number}*/var calc = function (s1, s2, char) {switch (char) {case "+": return s1 + s2;case "-": return s1 - s2;case "*": return s1 * s2;case "/": return (s1 / s2) <= 0 ? Math.ceil(s1 / s2) : Math.floor(s1 / s2);}
}
var evalRPN = function (tokens) {let stack = [],len = tokens.length;let res = null;for (let i = 0; i < len; i++) {if (tokens[i] === "+"|| tokens[i] === "-"|| tokens[i] === "*"|| tokens[i] === "/") {let s2 = stack.pop(),s1 = stack.pop();res = calc(s1 * 1, s2 * 1, tokens[i]);stack.push(res);} else {stack.push(tokens[i]);}}return stack.pop();
};

参考:
波兰表达式与逆波兰表达式
js实现逆波兰式

JS实现逆波兰表达式相关推荐

  1. java 实现逆波兰表达式_逆波兰表达式java实现

    知道逆波兰表达式是一个偶然的情况,在用js的时候偶然发现了js中的一个eval函数,数学的表达式它竟然能直接解析出结果.后面通过查询才得知里面的核心是用的逆波兰表达式的算法.后面网上找了一下java的 ...

  2. LeetCode实战:逆波兰表达式求值

    题目英文 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...

  3. 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)

    题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...

  4. 数据结构:后缀表达式(逆波兰表达式)

    逆波兰表达式计算 package com.atchina.stack;import java.util.ArrayList; import java.util.List; import java.ut ...

  5. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  6. LetCode: 150. 逆波兰表达式求值

    提示 LintCode中的相关算法题实现代码,可以在我的GithHub中下载. 题目需求 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另 ...

  7. Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)

    Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...

  8. 简单计算器 逆波兰表达式

    问题 C: 悠派计算器 时间限制: 1 Sec  内存限制: 128 MB 提交: 7  解决: 2 [提交][状态][讨论版][命题人:qianyouyou] 题目描述 yoyo的小老弟小渣渣灰特别 ...

  9. 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  10. 逆波兰表达式简单介绍

    逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的 ...

最新文章

  1. c# winForm DotNetBar控件之SuperGridControl
  2. python中立方表示_在Python中表示一个对象的方法
  3. java分页查询_面试官:数据量很大,分页查询很慢,有什么优化方案?
  4. TFS(Visual Studio Team Services) / Azure Devops git认证失败 authentication fails 的解决方案 http协议
  5. android 8.0 以后 uiautomator 无法直接使用的问题
  6. php实战视频教程 帝国cms二次开发,PHP实战视频教程,帝国CMS二次开发之完成首页模板的制作.ppt...
  7. 国产车崛起粉碎德日工业神话
  8. 灰色系统理论的介绍与解释
  9. input onchange事件不触发 oninput onpropertychange onchange 实时监听
  10. 菲利普·安德森:凝聚态物理的艺术家
  11. centos7 安装sogou输入法
  12. Arcgis应用(十二)栅格数据翻转(Flip)、镜像(Mirror)、重缩放(Rescale)、旋转(Rotate)、移位(Shift)、弯曲(Warp)
  13. 第四周助教工作总结——NWNU李泓毅
  14. css 屏幕背景图片 img.html
  15. Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader
  16. 遮罩层 遮挡不住 flash曲线的解决办法
  17. 气象数据免费下载(超级好用)
  18. setcontext
  19. 中了勒索病毒怎么办?怎么预防
  20. 一分钟搞懂云计算和大数据对人到底有啥用?

热门文章

  1. 通信算法之三十:Turbo仿真链路开发基于《低压电力线宽带载波通信互联互通技术规范第4—1部分物理层通信协议》
  2. 微软笔试题《Arithmetic Puzzles》- 题解
  3. 【OpenCV + Python】时域和频域傅里叶变换
  4. 三国志战略版:Daniel_S6魏延虚弱流开荒实录
  5. 卡尔曼滤波器MATLAB实现(从一维到三维)
  6. 判断是否是IE浏览器或IE内核浏览器
  7. 龙帝国与避风港最新网址
  8. 思科路由器配置命令详解及实例
  9. 怎样使用摹客在线原型实现自动轮播图
  10. Windows系统 卸载 flash助手推荐弹窗