最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS 实现个位数四则运算

    正文概述 掘金(ValarMorgulish)   2021-05-09   396

    四则运算式,先乘除后加减 数 0~9,+-*/,没有括号

    1. 算法思路

    低优先级操作符遇到其右侧高优先级操作符,右侧优先运算 相同优先级的操作符,左侧优先运算 高优先级操作符遇到其右低优先级操作符,左侧优先运算

    2. 数据结构采用栈结构

    3. 单元测试

    let x = '3+2*3+6/3+6/2+9/3+5*3-8'
    
    // 操作符优先级 0 ~ 1
    let OPERATOR = [['+', 0], ['-', 0], ['*', 1], ['/', 1]]
    
    function run (x) {
    	let nArr = []
    	let oArr = []
    
    	let iRet = ''
    	let i = 0 // 头指针
    
    	let sNToken = x.charCodeAt(i) - 48
    	let sPToken = ''
    	let nPriority = 0
    
    	if (sNToken < 0 || sNToken > 9) {
    		iRet = `Error at position ${i} : is not a number(${x.charAt(i)})!`
    	} else {
    		nArr.push(sNToken)
    		i = 1
    		for (; i < x.length - 1 ;) {
    			// 获取操作符
    			sPToken = x.charAt(i);
    			// 验证操作符,获取优先级
    			nPriority = validateOperator(sPToken)
    			if (typeof nPriority !== 'number') {
    				iRet = `nPriority at position ${i}`
    				break 
    			}
    
    			// 获取第二个数
    			sNToken = x.charCodeAt(i + 1) - 48
    			if (sNToken < 0 || sNToken > 9) {
    				iRet = `Error at position ${i + 1} : is not a number(${x.charAt(i + 1)})!`
    			}
    
    			// 比较 优先级
    			(typeof(iRet = stackOut(oArr, nArr, false, nPriority)) == 'string') ? true : iRet = '';
    
    			if (iRet) {
    				break
    			}
    
    			// 压栈
    			nArr.push(sNToken)
    			let opPair = []
    			opPair[0] = sPToken
    			opPair[1] = nPriority
    
    			oArr.push(opPair)
    			i += 2
    		}
    
    		(typeof(iRet = stackOut(oArr, nArr, true)) == 'string')?true:iRet='';
    	}
    
    	if (iRet) {
    		console.log(iRet)
    	} else {
    		nRet = nArr.pop()
    	}
    
    	return nRet
    }
    
    function stackOut (oArr, nArr, bIsNotCareAboutPriority, nPriority) {
    	let iRet = ''
    	// 操作符栈顶元素的优先级是否大于当前优先级
    	//let flag = oArr.length != 0 && (bIsNotCareAboutPriority || oArr[oArr.length - 1][1] >= nPriority)
    	while (oArr.length != 0 && (bIsNotCareAboutPriority || oArr[oArr.length - 1][1] >= nPriority)) {
    		// 弹栈计算
    		let n
    		let n2 = nArr.pop()
    		let n1 = nArr.pop()
    		let op = oArr.pop()[0]
    
    		n = calculate(op, n1, n2)
    
    		if (typeof n !== 'number') {
    			iRet = n;
    		} else {
    			nArr.push(n)
    		}
    	}
    
    	return iRet === '' ? true : iRet
    }
    
    function calculate (op, n1, n2) {
    	let n;
    	let iRet = ''
    	switch (op) {
    		case '+': n = n1 + n2; break;
    		case '-': n = n1 - n2; break;
    		case '*': n = n1 * n2; break;
    		case '/': n = n1 / n2; break;
    		default:
    			iRet = `Error in calculate ${op}`
    			console.log(iRet)
    			break
    	}
    
    	if (iRet !== '' && (!isFinite(n) || isNaN(n))) {
    		iRet = 'Error, the result is invalid'
    	}
    
    	return iRet === '' ? n : iRet
    }
    
    function validateOperator (sPToken) {
    	let iRet = ''
    	let j = 0
    	for (j = 0; j < OPERATOR.length; j++) {
    		if (OPERATOR[j][0] == sPToken) {
    			break
    		}
    	}
    
    	if (j >= OPERATOR.length) {
    		iRet = `Error: Syntax error: invalid operator "${sPToken}"`
    	}
    
    	return iRet === '' ? OPERATOR[j][1] : iRet
    }
    
    console.log(run(x))
    

    起源地下载网 » JS 实现个位数四则运算

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元