问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言题目 表达式计算

发布网友 发布时间:2023-02-14 11:30

我来回答

1个回答

热心网友 时间:2023-09-12 13:57

假设没有括号匹配错误, 支持多余空白, 支持负数

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>

char str[110];
double seq[110];
int is_op[110];
int stk[110];

int level(int v) {
    switch(v) {
    case '+':
    case '-':
        return 1;
    case '*':
    case '/':
        return 2;
    }
    return -1;
}

int main() {
    int len;
    double pre_num = 0, num = 0, sign = 1;
    int sql = 0, stk_top = 0;
    int i;
    scanf("%s", str);
    len = strlen(str);
    seq[sql] = '(';
    is_op[sql++] = 1;
    for (i = 0; i < len; ++i) {
        if (isspace(str[i])) {
            continue;
        } else if (isdigit(str[i])) {
            num *= 10;
            num += str[i] - '0';
            pre_num = 1;
        } else {
            if (pre_num) {
                pre_num = 0;
                seq[sql++] = num * sign;
                sign = 1;
                num = 0;
            } else if (str[i] == '-') {
                sign = -1;
                continue;
            }
            seq[sql] = str[i];
            is_op[sql++] = 1;
        }
    }
    if (pre_num) {
        seq[sql++] = num * sign;
    }
    
    seq[sql] = ')';
    is_op[sql++] = 1;
    for (i = 0; i < sql; ++i) {
        if (seq[i] == '(') {
            stk[stk_top++] = i;
        } else if (seq[i] == ')') {
            int lr = stk[--stk_top];
            int j;
            int pre_op = '+';
            double pre1_num = 0, pre2_num = seq[lr + 1], ans;
            for (j = lr + 2; j < i; ++j) {
                if (level(seq[j]) > 1) {
                    if (seq[j] == '*') {
                        pre2_num *= seq[++j];
                    } else {
                        pre2_num /= seq[++j];
                    }
                } else {
                    if (pre_op == '+') {
                        pre1_num += pre2_num;
                    } else {
                        pre1_num -= pre2_num;
                    }
                    pre_op = seq[j];
                    pre2_num = seq[++j];
                }
            }
            if (pre_op == '+') {
                ans = pre1_num + pre2_num;
            } else {
                ans = pre1_num - pre2_num;
            }
            seq[lr++] = ans;
            memmove(seq + lr, seq + i + 1, (sql - i) * sizeof(double));
            memmove(is_op + lr, is_op + i + 1, (sql - i) * sizeof(int));
            sql -= i - lr + 1;
            i = lr;
        }
    }
    printf("%.3lf", seq[0]);
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玩GTA4时我的画面看别的地方都是黑的就只有我这一小范围能看的见!怎么... 金貂换酒的意思金貂换酒的近反义词 4.5×9/9等于几分之几? 9-3×5/9怎么计算? 0.3*5/9等于几分之几? "过了这个村就没了这个店 "的下一句是什么? 过了这个村没这个店下一句怎么接搞笑 过了这个村就没有这个店的下一句 “人权”是什么意思? 袁天沛个人作品 c语言程序运算题 达达退款的钱退回到哪 达达快送取消订单钱怎么退 挤的拼音组词 挤字组词有哪些 好词好句,五年级 如何辨别iphone6港版原装充电器的真假 中学文明礼仪手抄报内容 怎样杳询苹果6手机充电器头的真假? 充电器头怎么鉴定iphone uc网盘会员时长怎么算 入的港版6.e 怎么鉴定充电器的真伪吧 uc网盘离线次数用完 体重秤哪个牌子好 母子公司制组织有哪些分类 去哪可以学【嫩江鱼】这道菜的做法。如果您会做拿钱买也行。 手机支付宝不小心删了怎么办 支付宝打开后键盘就不能用了,什么键都变成加号,怎么回事呢?? 东芝笔记本安装支付宝控件后键盘失灵了 更新完支付宝插件后键盘不能使用怎么办 问个简单的C语言题目 达达有订单没有配送,多长时间系统取消 达达快送退款一周还没到 达达外卖有多黑?我真的看不下去了! 达达接完单顾客退款了怎么办 达达商城买的箱子取消了退款怎么查询 威海张村审车需要什么手续 威海哪里审车便宜2022 威海审车在什么地方 闲鱼退款会降信誉度吗? 闲鱼买家退货退款,卖家同意了,但是收到货影响二次销售,拒绝退款会影响淘宝店铺信誉吗? soul苹果能微信登入吗 接纳自己的黑暗,让黑暗流转成正能量。 在黑暗里,如何成为他人的光 如何冥想训练 美版苹果6plus可以用4g网络吗 马桶刷选购技巧 真心请教好医生 上周五做的包皮手术,尿道一直有点肿,今天去医院换药,医生说怕尿道粘连,又做的红光雾化,说明天还得去 做完包皮手术后尿尿一直会分叉。