能实现优先级的计算器

我在网上看了很多的计算器都是那种没有实现优先级预算的,都是按照输入顺序来计算的,我不是很喜欢那种,然后我在网上查了查有没有别的办法,然后我知道逆波兰表达式,要实现优先级计算器,这个技能是要掌握的,有小伙伴感兴趣的话可以去网上查一查学一下,我在这就不多说,就简单的提一下

  • 举一个栗子:
    原表达式 :2*(4-1) // 这里暂时先不考虑中间的变化过程,待会再说
    逆波兰表达式 :2 4 1 - *
    首先我们要遍历你波兰表达式,遇到时数字的话我们先不管,当我们遇到第一个符号是 - 时让 - 号的前面两个数字进行相应的运算,然后就会得到一个新的值,再遍历遇到号,遇到号时让他的前面两位进行预算,是一开始的2 和刚才3在进行运算,这样就实现了优先级运算

1.我么首先要考虑的是怎么获得逆波兰表达式
这时我们要定义两个栈,一个用来存放数字,一个存放符号,那么我么就要对原来的基础的表达式进行拆分,肯定会有人想到调用一个现成方法然后直接拆分成字符,这样操作不是很好 例如: 12+13 会被拆分成 1,2,+,1,3 ,所以要换一种方法
2.其次就是要考虑符号的优先级

/*
将数字和符号分离开我的思路是,给符号两边加上一个任意的字符,然后变成一个新的字符串,然后通过刚才加的这个字符来截取,来把他们分开
*/
 function nbl(text){
        var operand = []; //用于存放操作数的栈
        var operator = []; //用于存放操作符的栈
        var textArr = text.split('');
        var newTextArr = [];

        for(var i = 0; i < textArr.length; i++){
      
            if(text[i] == "+"||text[i]== "-"||text[i]== "*"||text[i]== "/"||text[i]== "("||text[i]== ")" && text[i] != ".")   //这里可以优化一下,我这样写就是直观容易理解一点{
                newTextArr.push("|",text[i],"|");
            }
            else{
                newTextArr.push(textArr[i]);
            }
        }
        var calTextArr = newTextArr.join('').split("|");
        calTextArr.unshift("#")

        for(var i = 0; i < calTextArr.length; i++){
            //如果是数字则直接入栈
            if(Number(calTextArr[i]) || Number(calTextArr[i]) == 0){
                operand.push(calTextArr[i]);
            }
            //如果是操作符则再根据不同的情况进行操作
            else {
                switch(true){
                    //如果operator栈顶是“(”或者遍历到的操作符是“(”则直接入栈
                    case calTextArr[i] == "(" && operator.slice(-1)[0] == "(":
                        operator.push(calTextArr[i]);
                        break;
                    /*如果遍历到的操作符是“)”则把operator中的操作符依次弹出并压入
                    operand中直至operator栈顶操作符为“(”,然后将“(”也弹出,但不压入
                    operand栈中
                    */
                    //(4+
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值