数据结构——逆波兰式
很久没有关注算法和数据结构,大部分知识都已经忘记了;是时间好好回炉一下了,说实话干读数据机构这本书还是挺枯燥而且这本书原理性比较多,有一定的难度。这不刚看到逆波兰式废了好大劲才搞懂,老了。。。
逆波兰式
逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)
算法实现
代码程序
//'1 + 2 * 3 + (4 * 5 + 6) * 7'function ReversePolish() {this.operatorStack = [];// this.operator = ['+', '-', '*', '/', '(', ')'];this.operator = {'+': 1,'-': 1,'*': 2,'/': 2,'(': 10,')': 10};this.rp = []; }ReversePolish.prototype.convert = function(str) {debugger;// ('15 + 2 * 3 + (4 * 5 + 6) * 7').trim().replace(/\s+/g, '').split(/([\+|\-|\*|\/|\(|\)])/)// ["15", "+", "2", "*", "3", "+", "", "(", "4", "*", "5", "+", "6", ")", "", "*", "7"] str.trim().replace(/\s+/g, '').split(/([\+|\-|\*|\/|\(|\)])/).filter(e => !!e).forEach(e => {if (/[0-9]/g.test(e)) { // 数字直接放入逆波兰式数组this.rp.push(e);} else {if (this.operatorStack.length === 0) {// 操作符栈为空直接压入栈this.operatorStack.push(e);} else {if (e === '(') { // 左括号直接入栈this.operatorStack.push(e);} else if (e === ')') { // 右括号弹出所有的操作符进入逆波兰数组,直至遇到 (, (不进入逆波兰数组let op = this.operatorStack.pop();while(op !== '(') {this.rp.push(op);op = this.operatorStack.pop();}// this.operatorStack.pop();} else { // 遇到其他操作符则弹出所有栈顶元素,直至遇到优先级更低的操作符,但是不处理(let op = this.operatorStack.pop();while(op && this.operator[op] >= this.operator[e] && op !== '(') {this.rp.push(op);op = this.operatorStack.pop();}if (op) {this.operatorStack.push(op);}this.operatorStack.push(e);}}}});// 运行结束后将所有的操作符栈弹出let op = this.operatorStack.pop();while(op) {this.rp.push(op);op = this.operatorStack.pop();}console.log(this.rp.join(' ')); };//15 2 3 * + 4 5 * 6 + 7 * + ReversePolish.prototype.eval = function(){let numberStack = [];this.rp.forEach(e => {if (/[0-9]/g.test(e)) {numberStack.push(Number(e));} else if (this.operator[e]) {let n2 = numberStack.pop();let n1 = numberStack.pop();switch(e) {case '+':numberStack.push(n1 + n2);break;case '-':numberStack.push(n1 - n2);break;case '*':numberStack.push(n1 * n2);break;case '/':numberStack.push(n1 / n2);}}});return numberStack.pop(); }let rp = new ReversePolish(); rp.convert('15 + 2 * 3 + (4 * 5 + 6) * 7'); rp.eval();
感觉逆波兰式不仅是一种方法,更是一种思想,逆波兰式这种计算方法没有必要知道任何运算符优先规则。就像我们实际业务中有很多逻辑判断、各种优先级的场景,是否也可以使用逆波兰式的思想来解决?上面的例子也是比较简单的情况,没有考虑运算符的执行顺序,对于2^2^3这个种,实际是等于2^8等于256,而不是4^3=64.
转载于:https://www.cnblogs.com/dojo-lzz/p/9000223.html
数据结构——逆波兰式相关推荐
- c语言数据结构逆波兰算法,[分享]表达式二叉树逆波兰式的转换程序源代码(C++)...
[分享]表达式二叉树逆波兰式的转换程序源代码(C++) RT,这是我两年前学数据结构时的作品. 拿出来给大家分享. ps:当时才学C++,代码写的不好,见笑了./*将中缀式转换为表达式树,并打印逆波兰 ...
- 【数据结构】波兰式、逆波兰式与中缀表达式
目录 中缀表达式 后缀表达式 前缀表达式 计算后缀表达式结果 计算机实现中缀转后缀 中缀表达式 中缀表达式即运算符在操作数之间的表达式,常见表达式均为中缀表达式.因为中缀表达式更利于人们理解以及计算 ...
- 线性数据结构的实现与应用_双端队列_逆波兰式_呼叫中心_XAUAT_(原问题自杜克大学Duke University cps110 C++ Stacks and Queues and Lists)
求收藏求转发! 附实验报告链接: https://blog.csdn.net/weixin_43781565/article/details/106507340 提供DOC资源 https://do ...
- PHP中的逆波兰式应用
定义 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后) 如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+ ...
- 逆波兰式与表达式求值
何为波兰式?何为逆波兰式? 如何与表达式求值联系起来? 波兰式.逆波兰式是数据结构和编译原理里面提到的知识点,我们平时的运算式都是这样的 2 + 3 * (5 - 1)-10(中缀表达式),这样表达式 ...
- 逆波兰式是什么(以及dc计算器如何使用)
最近看文档看到逆波兰式(Reverse Polish notation或者reverse-polish,RPN)就去查询了一下.如果需要较为详细的解释看这个链接:https://mathworld.w ...
- 编译原理 | 实验四 | 逆波兰式
目录 一.问题分析 二.算法思想 1.关于分词器 2.关于逆波兰式分析器: 三.实现代码 1.头文件 & 类视图 2.预处理部分 3.逆波兰分析过程 4.计算,输出部分 四.总结 一.问题 ...
- java逆波兰式求值_波兰式、逆波兰式与表达式求值
波兰式.逆波兰式是<数据结构>课程中讲解关于栈的时候提到的,栈是很简单的一种数据结构.但是这些理论的提出却是计算机早期发展领域的重大突破,值得仔细回味. 1. 中缀表达式 我们在数学中学到 ...
- 编译原理逆波兰式实验java_【实验三】—— 逆波兰式生成实验报告
实验三 逆波兰式生成实验报告 一.实验名称:逆波兰式生成 二.仪器.设备:计算机 三.参考资料:<编译原理教程>习题解析与上机指导(西安电子科技大 胡元义等) 四.实验目的:将非后缀式用来 ...
最新文章
- 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)
- SpringBoot+Vue+Echarts实现双柱体柱状图
- mysql create很多table,SQL CREATE TABLE 语句
- CSS3制作一个简单的进度条
- “劣质”的PHP代码简化
- java怎样输出一个文件夹,java合并一个文件夹下所有txt文件,输出到另一个txt,...
- 史上最全的 iOS测试工具集锦(自动化、性能)
- 三维GIS引擎平台设计
- 计算机cpu架构是什么意思,「电脑小白必备」一分钟快速了解CPU
- leetcode刷题java之739. 每日温度
- 脱水冷冻干燥宠物食品的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- bde oracle 商友的流程_BorlandC++使用BDE访问Oracle的方法
- 0x00007FFEB5D49149 处(位于 Project1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x000
- latex初学者的经验
- C语言程序设计课程设计(服装销售管理系统)
- 来说一说毕达哥拉斯定理
- POI操作Word文档工具
- 佛说,今生你嫁的人,是前世葬你的人
- 腾讯 Angel Graph 图计算框架在智能风控中的应用
- 【51Nod】1266 蚂蚁
热门文章
- 推荐一个高质量的git命名查询和学习的github仓库git-recipes
- 如何处理错误消息Please install the Linux kernel header files
- Windows设置HTML,windows怎么添加静态路由
- vue 如何将参数放到连接上_通过Vue路由传参的两种方式及Vue组件中接收参数的方式...
- 世界上没有一模一样的东西_世界上存在两根同时点燃同时燃尽一模一样的蜡烛吗?...
- mongodb的id的唯一性_mongodb中的objectid是collection中唯一,还是全db唯一,还是全宇宙唯一?...
- mysql optimize 作用_mysql optimize table
- ant vue 设置中文_Ant Design Vue 添加区分中英文的长度校验功能
- tcp压测工具_【解决方案】性能压测及分析调优实践
- 二叉树的锯齿形层序遍历Python解法