C/C++语言实现表达式的转换(中缀式转换为后缀式、前缀式)

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

#include <iostream>

using namespace std;
#define MAXSIZE 100

/*
 * 中缀式转换为逆波兰式(后缀式)
 * 算法思想描述:
 * 从左到右扫描中缀式字符数组,如果是数字(判断条件:数组中元素大于等于0,小于等于9),
 * 则压入保存结果的栈中;如果是运算符则压入辅助栈中。
 * 注意:如果遇到的运算符为左括号‘(’,则把之后遇到的所有运算符全部入栈,无须比较,直至遇到右括号,再逐个出栈。
 * 操作重点:左括号'('与右括号')'全部扔掉,无需放入结果栈。
 * 继续扫描,遇到数字重复上述过程,遇到运算符则与栈顶运算符进行优先级比较。
 * 如果本次扫描到的运算符的优先级小于等于栈顶运算符,则栈顶运算符出栈,把本次扫描到的运算符压入辅助栈中,否则直接压入栈中。
 * 继续重复上述过程,直至遇到‘\0’,即字符串结尾符号。
 * 此时,结果栈中即为转换后的波兰式。
 */
void inFixToPostFix(const char original[], char result[], int result_top);

/*
 * 中缀式转换为波兰式(前缀式)
 * 算法思想描述:
 * 与转换后缀式对称。从右到左扫描中缀式,中缀式的运算符优先级小于栈顶运算符优先级时栈顶元素出栈。
 * 遇到右括号')'是其余运算符全部入栈,直至遇到左括号‘(’。
 * 其余均相同。
 */
void inFixToPreFix(char infix[], int length, char result[], int result_top);

int getPriority(char c);


int main() {
    char result[MAXSIZE];
    char original[MAXSIZE] = {'a', '+', 'b', '-', 'a', '*', '(', '(', 'c', '+', 'd', ')', '/', 'e', '-', 'f', ')', '+',
                              'g', '\0'};

    int m = -1;
    inFixToPostFix(original, result, m);

    int i = 0;
    while (result[i] != '\0') {
        cout << result[i++] << " ";
    }
}

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

    if (c == '*' || c == '/') {
        return 1;
    }

    return -1;
}

void inFixToPostFix(const char original[], char result[], int result_top) {
    char aid[MAXSIZE];
    int aid_top = -1;
    int i = 0;

    while (original[i] != '\0') {
        if (original[i] >= 'a' && original[i] <= 'z') {
            result[++result_top] = original[i++];
        } else if (original[i] == '(') {
            aid[++aid_top] = original[i++];
        } else if (original[i] == '+' || original[i] == '-' || original[i] == '*' || original[i] == '/') {
            if (aid_top == -1 || getPriority(original[i]) > getPriority(aid[aid_top])) {
                aid[++aid_top] = original[i++];
            } else {
                while (getPriority(original[i]) <= getPriority(aid[aid_top]) && aid_top >= -1) {
                    result[++result_top] = aid[aid_top--];
                }
            }
        } else if (original[i] == ')') {
            while (aid[aid_top] != '(') {
                result[++result_top] = aid[aid_top--];
            }
            --aid_top;
            ++i;
        }
    }

    while (aid_top != -1) {
        result[++result_top] = aid[aid_top--];
    }
}
···
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

随风舞落叶殇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值