基本计算器II

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。

示例 1:

输入:s = “3+2*2” 输出:7

示例 2:

输入:s = " 3/2 " 输出:1

方法:

每次遍历到数字末尾时,根据 数字前一个符号 来决定计算方式:

加号:将数字压入栈;
减号:将数字的相反数压入栈;
乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。

c实现

#define Max 100
int calculate(char * s){
    int res = 0, d = 0;
    char sign = '+';
    int *nums;
    int j = 0, tmp;
    int strLen = strlen(s);
    printf("strLen = %d \n",strLen);
    nums = (int*)malloc(sizeof(int) * (strLen + 1));
    memset(nums, 0, sizeof(int) * (strLen + 1));
    for (int i = 0; i < strLen; i++) {
    	// 截取一个整数
        if (s[i] >= '0') { // 加减乘除和空格ASCII码都小于'0'
            d = d * 10 - '0' + s[i];  // 进位(先减法)
        }
        // 操作符处理
        // "+" " - " 先入栈保存, 优先级低嘛,先保存着
        // '*'  '/' 需要直接和当前栈顶的计算,计算完后放回栈中保存
        if ((s[i] < '0' && s[i] != ' ') || i == strLen - 1) { // 遍历到最后一个数字了, 需要进行处理
            if (sign == '+') {
                // printf("d1 = %d \n",d);
                nums[j++] = d;
            } else if (sign ==  '-') {
                nums[j++] = -d;
            } else if (sign == '*' || sign == '/') {
                j--;
                tmp = sign == '*' ? nums[j] * d : nums[j] / d;
                // printf("tmp = %d \n",tmp);
                nums[j++] = tmp;
            }
            sign = s[i];
            d = 0;
        }
    }
    // 处理还在栈的数字
    for (; j >= 0; j--) {
        res += nums[j];
    }
    return res;
}

问题

这个版本比较初级,不需要考虑异常校验

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值