后缀表达式求值
Leetcode 第150题 150逆波兰表达式求值
思路
建立一个用于存数的栈,逐一扫描后缀表达式中的元素
- 如果遇到一个数,则把改数入栈
- 如果遇到运算符,就取出栈顶的两个数进行计算,然后把结果入栈
扫描完成后,栈中恰好剩一个数,就是后缀表达式的值
/*** @param {string[]} tokens* @return {number}*/var evalRPN = function(tokens) {let stack=[]for(token of tokens){if(token === "+" ||token==="-"||token==="*"|| token==="/"){let y=stack.pop()let x=stack.pop()let z=calc(x,y,token)stack.push(z)}else{stack.push(parseInt(token))}}return stack[0]};var calc=function(x,y,op){if(op==="+") return x+yif(op==="-") return x-yif(op==="*") return x*yif(op==="/") return parseInt(x / y, 10);return 0}
中缀表达式求值
leetcode第227题 227. 基本计算器 II
思路
先将中缀表达式转换为后缀表达式。建立一个用于存运算符的栈,逐一扫描中缀表达式中的元素
- 遇到一个数,输出该数
- 遇到运算符,只要栈顶符号的优先级>=新符号,就不断取出栈顶并输出,最后把新符号入栈。优先级顺序为乘除号>加减号>
- 依次取出并输出栈中的所有剩余符合
最终输出一个后缀表达式 然后调用上一题实现的函数
/*** @param {string} s* @return {number}*/var evalRPN = function (tokens) {let stack = [];for (token of tokens) {if (token === "+" || token === "-" || token === "*" || token === "/") {let y = stack.pop();let x = stack.pop();let z = calc(x, y, token);stack.push(z);} else {stack.push(parseInt(token));}}return stack[0];};var calc = function (x, y, op) {if (op === "+") return x + y;if (op === "-") return x - y;if (op === "*") return x * y;if (op === "/") return parseInt(x / y, 10);return 0;};var calculate = function (s) {s += " ";//处理表达式是数字结尾的情况let num = "";let stack = [];//保存运算符let list = [];//后缀表达式for (let ch of s) {if (ch >= "0" && ch <= "9") {num += ch;continue;} else {if (num.length != 0) {list.push(num);num = "";}}if (ch === " ") continue;let currRank = getRank(ch);while (stack.length != 0 && getRank(stack[stack.length - 1]) >= currRank) {list.push(stack.pop());}stack.push(ch);}while (stack.length != 0) {list.push(stack.pop());}return evalRPN(list)};var getRank = (ch) => {if (ch === "*" || ch === "/") return 2;if (ch === "+" || ch === "-") return 1;return 0;};
