JavaScript 进行四则运算
项目开发中遇到一个棘手的问题,就是根据数学表达式进行基本的四则运算得出结果,在网上查询了许多资料都没有找到合适的前端实现方案,全是一些像a+b这样的简单demo,最终从一篇C语言实现的方案中找到了解决思路并通过JavaScript实现,写下这篇博文分享给大家,也算是抛砖引玉,代码中的不足之处敬请谅解。
相关的知识点如下:
堆栈,逆波兰表达式,递归,类,正则表达式
以上相关的基础知识在这里就不说了,大家可以去百度以下,直接上代码
通过数组模拟堆栈:
class Stack {
constructor() {
this.stack = [];
}
getLength() {
return this.stack.length;
}
peek() {
const len = this.getLength();
return len ? this.stack[len - 1] : undefined;
}
pop() {
return this.stack.pop();
}
push(num) {
this.stack.push(num);
return undefined;
}
reset() {
this.stack = [];
return undefined;
}
}
堆栈最重要的就是后进先出,以上代码就是通过数组模拟了堆栈的这一特性,代码很简单一看都懂
关于计算:
思路就是套用逆波兰表达式,将a+b*c-d这样的表达式改写成dabc*+-这样的形式,然后把数字和运算符分别存入两个栈中,最后遍历两个栈把数字和运算符分别取出简化成两个数字间的运算,先来看看主体运算部分
calculate(expression) {
// matchInBrackets方法在这里是先计算表达式()中的内容变成a+b*c-d这样的简单算式方便计算
// 这里先不讲它,先来看a+b*c-d这样类型的表达式是怎么计算的
expression = this.matchInBrackets(expression);
// 从后向前逐个字符的遍历表达式
for (let i = expression.length - 1; 0 <= i; i--) {
const numReg = /[\d|\.]/; // 用来判定字符是数字和小数点
let char = expression[i]; // 取到的字符
if (numReg.test(char)) {
// 这里在将每一个字符最终拼接为一个完整的数字
this.tempNum = char + this.tempNum;
if (0 == i) {
/*
如果表达式开头是数字,并且之后跟的是乘除运算,要先把乘除算出来
例如 a*b-c... 这时要把a*b的值先计算出来存到栈顶
calculateMultiOrDivis方法主要用来计算乘法和除法这两个优先级
*/
if (this.tempSym) {
// 如果是优先级的计算符在下面的代码中会将它缓存
this.calculateMultiOrDivis(this.tempSym);
this.tempSym = ''; // 计算完后要把他置空为下次缓存做准备
}
// 如果经过上面的计算这里就不会再有缓存的数字
if (this.tempNum) this