算法学习——算术表达式
来源:互联网 发布:mac怎么看硬盘容量 编辑:程序博客网 时间:2024/06/05 06:12
题目描述:
The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
Some examples:
"1 + 1" = 2
" 2-1 + 2 " = 3
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
Some examples:
"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23
题目分析:
这道题是标准算数表达式的一个变式,区别在于题目之中的有括号有省略的情况。所以整体思路为:双栈,一个栈stack放操作数,一个栈opr放操作符。
思路:遇到+ 、-、(的时候,操作符压栈opr
遇到)的时候,从stack 和opr中弹出计算需要的操作数个数,同时把结果压栈stack,直到遇到(为止
在计算完这一组括号了之后,持续计算,到上一个(为止,这是处理()中的数作为一个操作数的情况
遇到数字的情况,压栈,同时计算到(为止,这是保证从左到右的运算数据
注: 也可以以后缀表达的角度来理解这道题。
/** * @param {string} s * @return {number} */var calculate = function(s) { var string = []; for(var i=0; i<s.length; i++){ if(s[i] == ' ') continue; var str = ""; while(s[i]-'0'>=0 && s[i] -'9'<=0){ str += s[i]; i++; } if(str.length > 0) string.push(str); s[i] && string.push(s[i]); } var stack = [],opr = [],i=0,len=string.length; while(i<len){ if(string[i] =='+'|| string[i]== '-' || string[i] == '('){ opr.push(string[i]); i++; }else if(string[i] == ')'){ while(opr[opr.length-1] !== '('){ var n2 = stack.pop(), n1 = stack.pop(), op = opr.pop(); stack.push(op == '+'? n1+n2: n1-n2); } opr.pop(); // 去掉( while(opr.length>0 && opr[opr.length-1]!== '('){//把前面的运算式都计算了 var n2 = stack.pop(), n1 = stack.pop(), op = opr.pop(); stack.push(op == '+'? n1+n2: n1-n2); } i++; }else{ stack.push(parseInt(string[i],10)); while(opr.length>0 && opr[opr.length-1]!== '('){//把前面的运算式都计算了 var n2 = stack.pop(), n1 = stack.pop(), op = opr.pop(); stack.push(op == '+'? n1+n2: n1-n2); } i++; } } return stack.pop(); };
0 0
- 算法学习——算术表达式
- 栈——算术表达式
- 算术表达式的转换——算术表达树
- 经典算法-算术表达式求值
- 经典算法-算术表达式求值
- 经典算法-算术表达式求值
- 经典算法-算术表达式求值
- 【经典算法】-算术表达式求值
- 算法——算术表达式计算问题(堆栈典型应用)
- 文兄的算法题——算术表达式递归构造二叉树
- C语言程序设计实战——算术表达式
- JavaScript学习(4.5):算术表达式
- 算法 -- 双栈算术表达式求值算法
- 算法竞赛入门经典 1.1 算术表达式
- 双栈算术表达式求值算法
- 双栈算术表达式求值算法
- Dijkatra 迪克斯特拉双栈算术表达式求值算法 Java
- Dijkstra双栈算术表达式求值算法
- 关于springboot里的日子配置
- HTC Vive controller手柄运动方向识别
- ubuntu虚拟机安装vmware_tools
- 记录一次PHP项目报502的问题
- GDB十分钟教程
- 算法学习——算术表达式
- 前端面试学习(五)
- 消息队列--大型网站架构之分布
- 关于前端项目经验
- j2ee 文件下载
- 欠拟合、过拟合及其解决方法
- 顺心随笔(二)
- Java并发编程
- 代码笔记:caffe-reid中PairEuclideanLayer源码解析