JavaScript 模拟堆栈进行四则运算

@JavaScript 模拟堆栈进行四则运算

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值