计算器(只含+-*/)

eg:

Input: "1+3*18/2+7-3*4"

Output: 23

Code:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

int vals[128];
int valTop=0;
int valBottom=0;

char ops[128];
char opTop=0;
char opBottom=0;

bool valIsEmpty()
{
    return valBottom == valTop;
}

void getTopVal(int *val)
{
    *val = vals[valTop-1];
}

void popVal()
{
    valTop--;
}

bool opIsEmpty()
{
    return opBottom == opTop;
}

void getTopOp(char *op)
{
    *op = ops[opTop-1];
}
void popOp()
{
    opTop--;
}

bool cal(int a,int b,int *res,char op)
{
    if(op=='/' && b==0){
        return false;
    }
    switch (op) {
        case '+':
            *res = a + b;
            break;
        case '-':
            *res = a - b;
            break;
        case '*':
            *res = a * b;
            break;
        case '/':
            *res = a / b;
            break;
        default:
            break;
    }
    return true;
}

bool Calc(const char* expression, int *res)
{
    int len = strlen(expression);
    int idx = 0;
    // "1+3*18/2+7-3*4"
    while(idx < len){
        if(expression[idx] >= '0' && expression[idx] <= '9' || idx==0) {
            char *p = expression+idx;
            char *end;
            int val = strtol(p,&end,10);
            int dis = end - p;
            idx+=dis;
            if(opIsEmpty()) {
                vals[valTop]=val;
                valTop++;
                continue;
            } else {
                char op;
                getTopOp(&op);
                if (op=='*' || op=='/'){
                    popOp();
                    int a;
                    getTopVal(&a);
                    popVal();
                    int result;
                    bool ret = cal(a,val,&result,op);
                    if(!ret){
                        return false;
                    }
                    vals[valTop]=result;
                    valTop++;
                } else{
                    vals[valTop]=val;
                    valTop++;
                }
            }

        }else {
            ops[opTop]=expression[idx];
            opTop++;
            idx++;
        }
    }
    while(!opIsEmpty()) {
        int b;
        getTopVal(&b);
        popVal();
        int a;
        getTopVal(&a);
        popVal();
        char op;
        getTopOp(&op);
        popOp();
        int result;
        cal(a,b,&result,op);
        vals[valTop]=result;
        valTop++;
    }

    for(int i=0;i<valTop;i++){
        printf("%d ",vals[i]);
    }
    printf("\n");
    for(int i=0;i<opTop;i++){
        printf("%c ",ops[i]);
    }
    printf("\n");
    return true;

}

int main() {


    char *str = "-1+3*18/2+7-3*4";
    int res;
    Calc(str,&res);

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值