C/C++语言实现利用栈计算中缀表达式的值

在考研复习过程中,我发现严书上给出的代码非常不易于理解,并且搜索引擎搜到的一些博客所写的代码实在是一言难尽。所以在此更新一些根据我自己的理解写的代码,希望可以帮助到初学者以及正在复习数据结构的人。同时也希望大家可以重视代码的规范性,提高代码的可阅读性。一定要做到见名知意。不要写出类似int a,b,c,d,e,f,g,以及不缩进不使用驼峰命名法的垃圾代码。

#include "iostream"

#define MAXSIZE 100
using namespace std;

int getPriority(char c);

float cal(float f1, float f2, char c);

float midCalculate(const char original[]);

int main() {
    char original[MAXSIZE] = {'3', '+', '4', '*', '5', '*', '(', '2', '+', '3', ')', '\0'};

    cout << midCalculate(original);
}

int getPriority(char c) {
    if (c == '+' || c == '-') {
        return 0;
    } else {
        return 1;
    }
}

float cal(float f1, float f2, char c) {
    if (c == '+') {
        return f1 + f2;
    }

    if (c == '-') {
        return f1 - f2;
    }

    if (c == '*') {
        return f1 * f2;
    }

    if (c == '/' && f2 != 0) {
        return f1 / f2;
    } else {
        return 0;
    }

    return 0;
}

float midCalculate(const char original[]) {
    float num_aid[MAXSIZE] = {};
    char operator_aid[MAXSIZE] = {};
    int num_top = -1;
    int operator_top = -1;
    int i = 0;

    while (original[i] != '\0') {
        if (original[i] >= '0' && original[i] <= '9') {
            num_aid[++num_top] = (float) original[i++] - '0';
        } else if (original[i] == '(') {
            operator_aid[++operator_top] = original[i++];
        } else if ((original[i] == '+' || original[i] == '-' || original[i] == '*' || original[i] == '/')) {
            if (operator_top == -1 || getPriority(original[i]) > getPriority(operator_aid[operator_top]) ||
                operator_aid[operator_top] == '(') {
                operator_aid[++operator_top] = original[i++];
            } else {
                while (getPriority(original[i]) <= getPriority(operator_aid[operator_top]) && operator_top > -1) {
                    float b = num_aid[num_top--];
                    float a = num_aid[num_top--];
                    num_aid[++num_top] = cal(a, b, operator_aid[operator_top--]);
                }
            }
        } else if (original[i] == ')') {
            while (operator_aid[operator_top] != '(') {
                float b = num_aid[num_top--];
                float a = num_aid[num_top--];
                num_aid[++num_top] = cal(a, b, operator_aid[operator_top--]);
            }
            operator_top--;
            i++;
        }
    }

    while (operator_top > -1) {
        float b = num_aid[num_top--];
        float a = num_aid[num_top--];
        num_aid[++num_top] = cal(a, b, operator_aid[operator_top--]);
    }

    return num_aid[num_top];
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风舞落叶殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值