2021-02-25

面试题 16.26. 计算器 给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。

表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。

示例 1:

输入: “3+2*2” 输出: 7 示例 2:

输入: " 3/2 " 输出: 1 示例 3:

输入: " 3+5 / 2 " 输出: 5

算法题很多时候考的是看待问题的思路
把3-2*5 看成 3+(-2)*5
这样一来就可以先识别乘法 全变成加法

int calculate(char* s){
//此题用栈的知识 
//因为我们知道这道题的难点就在于符号之间的优先级 有的东西不能提前算
//先算乘除 再算加减 
//所以 扫描一遍字符串把乘除先算出来 -正数变成+负数
//这样就可以全部用+来算
int len = strlen(s);
    int *stack = (int*)malloc(sizeof(int) * len);
    int top   = 0;
    char oper = '+';
    int res   = 0;
    int num   = 0;
    int i;
    char ch;

    /* 字符串处理一遍即可 */
    for (i = 0; i <= len; i++) {
        ch = s[i];
        if (ch == ' ') { /* 空格跳过 */
            continue;
        }
        if (ch >= '0' && ch <= '9') { /* 数字拼起来 */
            num = num * 10 + (ch - '0');
        } else { /* 记录当前运算符, 先处理上一个运算符 */
            if (oper == '+') {
                stack[top++] = num;
            } else if (oper == '-') {
                stack[top++] = -num;
            } else if (oper == '*') {
                stack[top - 1] = stack[top - 1] * num;
            } else if (oper == '/') {
                stack[top - 1] = stack[top - 1] / num;
            }
            oper = ch;
            num  = 0;
        }
    }
    /* 栈非空时, 栈元素相加 */
    while (top > 0) {
        res += stack[--top];
    }
    return res;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值