中缀表达式就是我们平时见到的算数表达式;前缀表达式被称为波兰式;后缀表达式被称为逆波兰式

中缀表达式转换逆波兰式实现逻辑

  • 创建运算符栈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实现逆波兰式相关推荐

  1. java逆波兰式求值_波兰式、逆波兰式与表达式求值

    波兰式.逆波兰式是<数据结构>课程中讲解关于栈的时候提到的,栈是很简单的一种数据结构.但是这些理论的提出却是计算机早期发展领域的重大突破,值得仔细回味. 1. 中缀表达式 我们在数学中学到 ...

  2. Perl实现逆波兰式与递归计算

      近一个学期都没有写过博客了,甚至CSDN也很少来了,有点想念这里了.大三忙的比高三还累,早八点出,晚十二点归,弄得自己都不知道是在读大学还是在工作.另一方面兴趣也逐渐转移了,对纯软件没有以前那样着 ...

  3. php逆波兰表达式,PHP根据数字的字符表达式计算出结果(转换成逆波兰式再求解)[转]...

    这个简单的计算器采用的是逆波兰式来做的,仅支持加减乘除四种运算,纯粹个人练习记录一下,还望多多支持. 用法 require 'Calc.php'; $calc = new Calc('(1+9)/2' ...

  4. 将表达式转换成逆波兰式

    http://www.cnblogs.com/stay-foolish/archive/2012/04/25/2470590.html 假设表达式由单字母变量和双目四则运 算算符构成.试写一个算法,将 ...

  5. 数据结构——逆波兰式

    很久没有关注算法和数据结构,大部分知识都已经忘记了:是时间好好回炉一下了,说实话干读数据机构这本书还是挺枯燥而且这本书原理性比较多,有一定的难度.这不刚看到逆波兰式废了好大劲才搞懂,老了... 逆波兰 ...

  6. c语言int 转bool_C++代码实现逆波兰式_C 语言

    100行以内C++代码实现逆波兰式 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后). 算术表达式转逆波兰式例子: 逆波兰式整 ...

  7. PHP中的逆波兰式应用

    定义 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)  如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+  ...

  8. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  9. 逆波兰式与表达式求值

    何为波兰式?何为逆波兰式? 如何与表达式求值联系起来? 波兰式.逆波兰式是数据结构和编译原理里面提到的知识点,我们平时的运算式都是这样的 2 + 3 * (5 - 1)-10(中缀表达式),这样表达式 ...

最新文章

  1. mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别
  2. Linux下getopt()函数的简单使用
  3. vba执行linux命令,从VBA中的shell命令捕获输出值?
  4. FreeRTOS任务挂起和恢复
  5. Oracle 使用GSON库解析复杂json串
  6. Ubuntu系统下ntp服务器搭建2
  7. 进程环境之命令行参数
  8. 深度学习福利入门到精通第五讲——ResNet模型
  9. Linux部署DotNetCore记录
  10. 解决ubuntu20.04虚拟机无法上网的问题
  11. matlab均值滤波代码6,均值滤波matlab程序代码
  12. 关于过程改进和能力提升
  13. 大话布隆过滤器及其应用场景
  14. SolidWorks参数化设计中Excel的应用
  15. 如何横扫棋坛?AlphaGo 先随机扔了一个骰子
  16. A - Artwork ( 并查集 )
  17. BGP----工作工程,路由黑洞,防环机制,基本配置
  18. 2021-10-27 孤尽训练营D2
  19. 扬州大学广陵学院计算机科学与技术女生多吗,超激动!萌新们纷纷晒出与扬大录取通知书合照...
  20. matlab主要功能,matlab一些基本函数的功能

热门文章

  1. 赛扬J4105和赛扬N5095哪个好
  2. 测试单核cpu和多核cpu执行java多线程任务的效率
  3. 单核CPU和多核CPU
  4. 计算两个字符串之间的相似度
  5. python练习题17
  6. 面试官:设计“抖音”直播功能测试用例吧
  7. 大数据在智慧消防领域的应用
  8. amigo幸运字符什么意思_无线网络ssid是什么意思(全面解析SSID涵义)
  9. 个人理财--知识点总结
  10. golang cond