C++应用实例之计算器的实现

给你一个字符串表达式 s ,实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
例如:s = "3+2*2/2"
对于计算式我们了解到乘除优先级高于加减,所以对于本题我们有一种思路:所有的加减我们可以转化成正负数,而乘除则相当于前面的正负数去*或/后面的数。
具体实现思路:
注意:初始化符号要为‘+’。
使用栈来解决,碰到加减运算,就转换成正负数依次存入栈中,遇到乘除运算,则分别使得栈的首元素*或/相应的值后替换原来的首元素,最后再将栈内的所有元素进行相加即可得出结果。注意所有的运算应该基于数据的运算,所以我们首先考虑的是数据的位数判断计算,而后再根据数据前面的符号进行相应的栈内数据操作,如此一来,总是在遍历到数据之后的符号时才对前面的数据进行操作,就带来一个问题最后一位数据后面没有符号,所以加了判断条件i == l - 1,至于s[i] != ' ',则是为了防止出现数据后有空格的情况。
进阶:后续的文章会给出一个完整功能计算器的实现,即遇到括号,判断前括号前面的符号若为负,则括号内的所有数据正负要相应变换,遇到幂运算,优先级又要高于乘除。
注:此题也可以用容器vector实现,差别在于容器存数据从末尾存入,取数据也是从末尾取出,运算也是末尾处进行运算,当然容器有一个更方便快捷的计算方法,相对于栈来说不用一一弹出数据,可以利用accumulate函数将容器内所有数据进行相加,提升运算速度。
int calculate(string s) {
        int i;
        int l = s.size();
        stack<int> stk;
        long int number = 0;
        char sign = '+';
        long int m = 0;
        for (i = 0; i < l; i++) {
            if (isdigit(s[i])) {
                number = number * 10 + s[i] - '0';
            }
            if (!isdigit(s[i]) && s[i] != ' ' || i == l - 1) {
                switch (sign) {
                case'+':
                    stk.push(number);
                    break;
                case'-':
                    stk.push(-number);
                    break;
                case'*':
                    stk.top() = stk.top() * number;
                    break;
                default:
                    stk.top() = stk.top() / number;
                }
                sign = s[i];
                number = 0;
            }
        }
        while (!stk.empty()) {
            m = m + stk.top();
            stk.pop();
        }
        return m;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值