JavaScript实现逆波兰式
中缀表达式就是我们平时见到的算数表达式;前缀表达式被称为波兰式;后缀表达式被称为逆波兰式
中缀表达式转换逆波兰式实现逻辑
- 创建运算符栈operator,结果栈result
- 中缀表达式从左到右出栈
- 当字符为数字时,直接压入result栈
- 当字符为运算符时
- 如果operator栈顶元素优先级不小于当前字符,则将operator栈顶元素出栈,直到operator栈顶元素优先级低于当前元素或遇到‘(’时将当前元素压入operation
- 当前字符为“(”时,直接压入operator
- 当前字符为")“时,将operator栈中的字符依次从栈顶压入result直到遇到第一个”("(停止并删除’(')或栈清空
- 当中缀表达式清空时,将operator栈中的剩余字符依次压入result栈
const calculator = (str) => {/*** operator:运算符栈* result:结果栈* nowIndex:当前下标*/let operator = [], result = [], nowIndex = 0;const weight = {'+': 1,'-': 1,'*': 2,'/': 2,'(': 3,')': 3,}while (str[nowIndex]) {if (str[nowIndex]) {if (/\d/.test(+str[nowIndex])) {// 数字result.push(str[nowIndex])} else if (/\(|\)/.test(str[nowIndex])) {if (str[nowIndex] === '(') {operator.push(str[nowIndex])} else {result.push(operator.pop())while (operator[operator.length - 1] !== '(') {result.push(operator.pop())}operator.pop()}} else if (/[\+\-\*\/]/.test(str[nowIndex])) {// 符号let nowTop = operator[operator.length - 1] //最顶层符号while ((weight[str[nowIndex]] <= weight[nowTop]) && nowTop !== '(') {result.push(operator.pop())nowTop = operator[operator.length - 1]// 也可以通过if判断里nowIndex-- 重新循环,但没有现在这么写节省性能}operator.push(str[nowIndex])}}// 一定要写在最后,否正写在上面使用的时候会跳过下标为0的第一个值nowIndex++}while (operator.length) {result.push(operator.pop())}return result.join('')}
计算逆波兰式实现逻辑
- 遍历逆波兰式,如果遇到数值则按顺序存储到数组中(push),如果遇到符号则用数组中最后两项进行计算并保存到数组中。
const getResult = (str) => {let arr = str.split('');console.log(arr)let resultArr = []; //当前结果arr.forEach((item, index) => {if (/\d/.test(+item)) {// 数字resultArr.push(+item)} else {// 字符let firstFloor = resultArr.pop();let secondFloor = resultArr.pop();switch (item) {case '+':resultArr.push(secondFloor + firstFloor);break;case '-':resultArr.push(secondFloor - firstFloor);break;case '*':resultArr.push(secondFloor * firstFloor);break;case '/':resultArr.push(secondFloor / firstFloor);break;}}})console.log(resultArr.pop())}
测试
let jisuan = '1+(2-3)+3-4-(5-1)/2+3*2'let result = calculator(jisuan);getResult(result) //3
JavaScript实现逆波兰式相关推荐
- java逆波兰式求值_波兰式、逆波兰式与表达式求值
波兰式.逆波兰式是<数据结构>课程中讲解关于栈的时候提到的,栈是很简单的一种数据结构.但是这些理论的提出却是计算机早期发展领域的重大突破,值得仔细回味. 1. 中缀表达式 我们在数学中学到 ...
- Perl实现逆波兰式与递归计算
近一个学期都没有写过博客了,甚至CSDN也很少来了,有点想念这里了.大三忙的比高三还累,早八点出,晚十二点归,弄得自己都不知道是在读大学还是在工作.另一方面兴趣也逐渐转移了,对纯软件没有以前那样着 ...
- php逆波兰表达式,PHP根据数字的字符表达式计算出结果(转换成逆波兰式再求解)[转]...
这个简单的计算器采用的是逆波兰式来做的,仅支持加减乘除四种运算,纯粹个人练习记录一下,还望多多支持. 用法 require 'Calc.php'; $calc = new Calc('(1+9)/2' ...
- 将表达式转换成逆波兰式
http://www.cnblogs.com/stay-foolish/archive/2012/04/25/2470590.html 假设表达式由单字母变量和双目四则运 算算符构成.试写一个算法,将 ...
- 数据结构——逆波兰式
很久没有关注算法和数据结构,大部分知识都已经忘记了:是时间好好回炉一下了,说实话干读数据机构这本书还是挺枯燥而且这本书原理性比较多,有一定的难度.这不刚看到逆波兰式废了好大劲才搞懂,老了... 逆波兰 ...
- c语言int 转bool_C++代码实现逆波兰式_C 语言
100行以内C++代码实现逆波兰式 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后). 算术表达式转逆波兰式例子: 逆波兰式整 ...
- PHP中的逆波兰式应用
定义 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后) 如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+ ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- 逆波兰式与表达式求值
何为波兰式?何为逆波兰式? 如何与表达式求值联系起来? 波兰式.逆波兰式是数据结构和编译原理里面提到的知识点,我们平时的运算式都是这样的 2 + 3 * (5 - 1)-10(中缀表达式),这样表达式 ...
最新文章
- mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别
- Linux下getopt()函数的简单使用
- vba执行linux命令,从VBA中的shell命令捕获输出值?
- FreeRTOS任务挂起和恢复
- Oracle 使用GSON库解析复杂json串
- Ubuntu系统下ntp服务器搭建2
- 进程环境之命令行参数
- 深度学习福利入门到精通第五讲——ResNet模型
- Linux部署DotNetCore记录
- 解决ubuntu20.04虚拟机无法上网的问题
- matlab均值滤波代码6,均值滤波matlab程序代码
- 关于过程改进和能力提升
- 大话布隆过滤器及其应用场景
- SolidWorks参数化设计中Excel的应用
- 如何横扫棋坛?AlphaGo 先随机扔了一个骰子
- A - Artwork ( 并查集 )
- BGP----工作工程,路由黑洞,防环机制,基本配置
- 2021-10-27 孤尽训练营D2
- 扬州大学广陵学院计算机科学与技术女生多吗,超激动!萌新们纷纷晒出与扬大录取通知书合照...
- matlab主要功能,matlab一些基本函数的功能