实验一、简单计算器的实现(具体实现)

本文介绍了使用JavaScript实现简单计算器的过程,包括声明运算符和数字数组,判断输入字符类型,中缀表达式转后缀表达式,并通过栈进行计算。文章指出在实现过程中遇到的问题,如连续运算符输入未处理,以及栈操作理解不透彻,表达了作者后续深入学习数据结构的决心。
摘要由CSDN通过智能技术生成

(文末提供原码)

声明运算符数组和数字数组

        sign数组:指运算符数组。由于细节问题,'D'可以清除最后一位数字或符号,也作为运算符来看待。

        minuSign数组:专门用来判断'-'是减号还是负号的数组。

        isNumber数组:把小数点也作为数字。便于小数数字的连接和完整。

// 不包括'('是因为'('可以放在首位
var sign = ['+', '÷', '=', ')', '%', 'x', '-', 'D'];
// 如果是这些符号,就说明'-'是负号,如果是')'说明是减号
var minuSign = ['+', '÷', '(', 'x', '-'];
var isNumber = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'];

判断是否输入两个连续的运算符

function judgeNext (text, number) {
    // 如果是负号,直接不管,没事
    if (number === '-')
        return;
    // 如果text栈顶元素存在并且又判断出这个是运算符,说明输入了连续两个运算符
    if (judgeSign(text[text.length - 1]) && judgeSign(number))
        return true;
    return false;
}

 判断输入的字符里面是不是数字

function judgeNumber (number) {
    for (let i = 0; i < isNumber.length; i++) {
        if (isNumber[i] === number)
            return true;
    }
    return false;
}

 true代表是负号,false代表是减号

function minus (number) {
    for (let i = 0; i < minuSign.length; i++) {
        if (minuSign[i] === number)
            return true;
    }
    return false;
}

 中缀表达式转后缀表达式

function houZhui (right) {
    // tempSign是临时存放运算符的栈
    var tempSign = [];
    // behindText存放的是后缀表达式
    var behindText = [];
    // 扫描中缀数组
    for (let i = 0; i < right.length; i++) {
        // 如果i是负号或者是')'
        if (minus(right[i]) || right[i] === ')') {
            if (tempSign.length === 0)
                tempSign.push(right[i]);
            else if (tempSign[tempSign.length - 1] === '(')
                tempSign.push(right[i]);
            else if (right[i] === '(')
                tempSign.push(right[i]);
            else if (right[i] === ')') {
                // 一直弹出直到遇到左括号
                while (tempSign[tempSign.length - 1] !== '(') {
                    let a = tempSign.pop();
                    // 然后把弹出的都传给后缀栈
                    behindText.push(a);
                }
                // 最后再弹出左括号
                tempSign.pop();
            }
            else if (right[i] === '-' || right[i] === '+') {
                while (tempSign[tempSign.length - 1] !== '(' && tempSign.length !== 0) {
                    let a = tempSign.pop();
                    // 传给后缀栈
                    behindText.push(a);
                }
                tempSign.push(right[i]);
            }
            else if (right[i] === 'x' || right[i] === '÷') {
                while (tempSign[tempSign.length - 1] !== '(' && tempSign[tempSign.length - 1] !== '+' && tempSign[tempSign.length - 1] !== '-' && tempSign.length !== 0) {
                    let a = tempSign.pop();
                    behindText.push(a);
                }
                tempSign.push(right[i]);
            }
        }
        // 如果不是负号和')'
        else {
            behindText.push(right[i])
        }
    }
    while (tempSign.length !== 0) {
        let a = tempSign.pop();
        behindText.push(a);
    }
    return behindText;
}

 计算后缀表达式

function caculate (right) {
    var NUMBER = [];
    for (let i = 0; i < right.length; i++) {
        // 是运算符就计算
        if (minus(right[i])) {
            // 加法
            if (right[i] === '+') {
                if (NUMBER.length < 2)
                    return "错误";
                else {
                    let a = NUMBER.pop();
                    let b = NUMBER.pop();
                    let c = a + b;
                    NUMBER.push(c);
                }
            }
            // 减法
            else if (right[i] === '-') {
                if (NUMBER.length < 2)
                    return "错误";
                else {
                    let a = NUMBER.pop();
              
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值