JavaScript实现一个简易计算器,能够混合运算

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
            table{
                margin: auto;
                padding: 1px;
            }

            th,input{
                height: 60px;
                width: 410px;
                background-color:rgb(247,246,246);
                text-align: right;
                font-size: 40px;
            }


            button{
                height: 100px;
                width: 100px;
                padding: 0px;
                font-size: 30px;
                border-radius: 50%;
            }

            th,input,td,button{
                border: 0px;
            }

            .calculate{
                background-color: rgb(181,181,183);
            }

            .operate{
                color: rgb(136,93,235);
                background-color: rgb(101,216,247);
            }

            button:hover{
                background-color: rgb(243, 157, 236);
            }
        </style>

</head>

<body>
    <div>
        <table border="1">
            <thead>
                <th colspan="4">
                    <input type="text" id="infor" disabled>
                    <input type="text" id="result" value="0" disabled>
                </th>
            </thead>

            <tbody>
                <tr>
                    <td><button class="operate"  id="clear" onclick="clearResult()">AC</button></td>
                    <td><button class="operate" id="backspace" onclick="clearOneResult()">C</button></td>
                    <td><button class="operate" id="%" onclick="showNumber(this)">%</button></td>
                    <td><button class="operate" id="/" onclick="showNumber(this)">/</button></td>
                </tr>
                <tr>
                    <td><button class="calculate" id="7" onclick="showNumber(this)">7</button></td>
                    <td><button class="calculate" id="8" onclick="showNumber(this)">8</button></td>
                    <td><button class="calculate" id="9" onclick="showNumber(this)">9</button></td>
                    <td><button class="operate" id="*" onclick="showNumber(this)">*</button></td>
                </tr>
                <tr>
                    <td><button class="calculate" id="4" onclick="showNumber(this)">4</button></td>
                    <td><button class="calculate" id="5" onclick="showNumber(this)">5</button></td>
                    <td><button class="calculate" id="6" onclick="showNumber(this)">6</button></td>
                    <td><button class="operate" id="-" onclick="showNumber(this)">-</button></td>
                </tr>
                <tr>
                    <td><button class="calculate" id="1" onclick="showNumber(this)">1</button></td>
                    <td><button class="calculate" id="2" onclick="showNumber(this)">2</button></td>
                    <td><button class="calculate" id="3" onclick="showNumber(this)">3</button></td>
                    <td><button class="operate" id= "+" onclick="showNumber(this)">+</button></td>
                </tr>
                <tr>
                    <td><button class="operate"  id="+/-" onclick="showNumber(this)">+-</button></td>
                    <td><button class="calculate" id="0" onclick="showNumber(this)">0</button></td>
                    <td><button class="calculate" id="." onclick="showNumber(this)">.</button></td>
                    <td><button class="operate" id="=" onclick="showAnswer()">=</button></td>
                </tr>
            </tbody>
        </table>
    </div>


    <script>
        // 定义一个数组
        var result = new Array();
        // 将+-*/定义为一个字符串
        var ops = "+-*/%";

        // 定义一个将数组转换为字符串的方法
        function arrToStr(arr) {
            var strResult = "";
            // 使用循环将数组元素遍历拼接到字符串上
            for (var i = 0; i < arr.length; i++) {
                strResult += arr[i];
            }
            // 返回该字符串
            return strResult;
        }

         // 显示点击结果
        function showResult() {
            var str = arrToStr(result);
            var arr = str.split("=");
            // 将计算过程显示在显示屏上半部分
            document.getElementById("infor").value = arr[0];
            // document.getElementById("result").value = arrToStr(result);
        }


        function showNumber(id) {
            var val = id.innerHTML;
            // 将数据存入result数组中
            result.push(val);
            // 调用showResult()方法
            showResult();
        }

        // 计算出答案并将答案显示在显示屏上
        function showAnswer() {
            // 定义一个用于存储答案的字符串
            var answer = "";
            // 将数组转化为字符串
            var str = arrToStr(result);

            var midExpre = strToExpress(str);
            var suffixExpre = midToSuffix(midExpre);
            answer = suffixValue(suffixExpre);
            //console.log(midExpre);
            //console.log(suffixExpre);
           
            document.getElementById("result").value = str + "=" + answer;

        }

        // 清空数据显示
        function clearResult() {
            result = [];
            showResult();
            // 清空结果显示0
            document.getElementById("result").value = 0;
        }

        // 删除录入的数据,从右向左依次一个一个的进行删除
        function clearOneResult() {
            result.pop();
            showResult();
        }



        function strToExpress(str) {

            var textArr = str.split('');
            var newTextArr = [];
            var calTextArr = [];

            for (var i = 0; i < str.length; i++) {
                //判断该字符是否是运算符
                if (ops.indexOf(str[i]) != -1) {
                    // 是运算符将该运算符添加到数组newTextArr中
                    newTextArr.push("|", str[i], "|");
                }
                else {
                    newTextArr.push(textArr[i]);
                }
            }

            calTextArr = newTextArr.join('').split('|');
            // alert(calTextArr); //calTextArr=1,+,3,*,6
            return calTextArr;
        }


        function midToSuffix(midExpre) {

            var opStack = [];
            var suffixExpre = [];
            // alert(midExpre);

            for (var i = 0; i < midExpre.length; i++) {

                if (ops.indexOf(midExpre[i]) != -1) {

                    if (opStack.length == 0 || Priority(midExpre[i]) > Priority(opStack[opStack.length - 1])) {
                        opStack.push(midExpre[i]);
                    }
                    else {
                        do {
                            suffixExpre.push(opStack.pop());
                        } while (opStack.length > 0 && Priority(midExpre[i]) <= Priority(opStack[opStack.length - 1]));

                        opStack.push(midExpre[i]);
                    }
                }

                else {
                    suffixExpre.push(midExpre[i]);
                }
            }

            while (opStack.length > 0) {
                suffixExpre.push(opStack.pop());
            }
            // alert(suffixExpre);//suffixExpre={1,3,6,*,+}
            return suffixExpre;
        }

        function Priority(op) {
            var opPri = 0;
            switch (op) {
                case "+":
                    opPri = 1;
                    break;
                case "-":
                    opPri = 1;
                    break;
                case "*":
                    opPri = 2;
                    break;
                case "/":
                    opPri = 2;
                    break;
                case "%":
                    opPri = 2;

            }
            return opPri;
        }

        function suffixValue(suffixExpre) {
            var calStack = [];
            // alert(suffixExpre);//1,3,6,*,+
            console.log(suffixExpre);
            for (var i = 0; i < suffixExpre.length; i++) {
                // if(suffixExpre[i] == "+-"){

                // }else 
                if (ops.indexOf(suffixExpre[i]) != -1) {
                    // alert(calStack);
                    var opRight = Number(calStack.pop());
                    var opLeft = Number(calStack.pop());
                    var tmpResult = 0;
                    switch (suffixExpre[i]) {
                        case '+':
                            tmpResult = opLeft + opRight;
                            break;
                        case '-':
                            tmpResult = opLeft - opRight;
                            break;
                        case '*':
                            tmpResult = opLeft * opRight;
                            break;
                        case '/':
                            tmpResult = opLeft / opRight;
                            break;
                        case '%':
                            tmpResult = opLeft % opRight;
                            // alert(tmpResult);
                    }
                    calStack.push(tmpResult);
                }
                else {
                    calStack.push(suffixExpre[i]);
                }

                console.log(calStack);
            }

            return calStack.pop();
            
        }


    </script>

</body>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值