后缀表达式求值
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+y
if(op==="-") return x-y
if(op==="*") return x*y
if(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;
};