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
    评论
实现中缀表达式后缀表达式前缀表达式的图形化界面,需要使用一些第三方库来实现界面设计和用户交互。下面以Qt为例,给出一个简单的实现过程: 1. 创建一个Qt项目并添加一个主窗口,用于显示图形界面。 2. 在主窗口上添加一些控件,如文本框、按钮等,用于输入中缀表达式、显示后缀表达式前缀表达式等。 3. 在按钮的点击事件中编写代码实现中缀表达式后缀表达式前缀表达式的功能。可以使用实现转换过程。 4. 将转换后的后缀表达式前缀表达式显示在相应的文本框中。 下面是一个简单的示例代码,用于实现中缀表达式后缀表达式前缀表达式的图形化界面: ```cpp #include <QMainWindow> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QHBoxLayout> #include <QStack> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建控件 infixEdit = new QLineEdit(this); postfixLabel = new QLabel(this); prefixLabel = new QLabel(this); convertBtn = new QPushButton("转换", this); // 创建布局 QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(infixEdit); layout->addWidget(convertBtn); layout->addWidget(postfixLabel); layout->addWidget(prefixLabel); // 创建中缀表达式后缀表达式前缀表达式的连接 connect(convertBtn, &QPushButton::clicked, this, &MainWindow::convert); // 设置布局 QWidget *widget = new QWidget(this); widget->setLayout(layout); setCentralWidget(widget); } public slots: void convert() { QString infix = infixEdit->text(); QString postfix = infixToPostfix(infix); QString prefix = infixToPrefix(infix); postfixLabel->setText(postfix); prefixLabel->setText(prefix); } private: QLineEdit *infixEdit; QLabel *postfixLabel; QLabel *prefixLabel; QPushButton *convertBtn; QString infixToPostfix(const QString &infix) { QStack<QChar> stack; QString postfix; for (int i = 0; i < infix.length(); i++) { QChar ch = infix[i]; if (ch.isDigit() || ch.isLetter()) { postfix += ch; } else if (ch == '(') { stack.push(ch); } else if (ch == ')') { while (!stack.isEmpty() && stack.top() != '(') { postfix += stack.pop(); } if (!stack.isEmpty() && stack.top() == '(') { stack.pop(); } } else { while (!stack.isEmpty() && precedence(stack.top()) >= precedence(ch)) { postfix += stack.pop(); } stack.push(ch); } } while (!stack.isEmpty()) { postfix += stack.pop(); } return postfix; } QString infixToPrefix(const QString &infix) { QString reversed = reverse(infix); QString postfix = infixToPostfix(reversed); QString prefix = reverse(postfix); return prefix; } int precedence(QChar op) { if (op == '+' || op == '-') { return 1; } else if (op == '*' || op == '/') { return 2; } return 0; } QString reverse(const QString &str) { QString reversed; for (int i = str.length() - 1; i >= 0; i--) { reversed += str[i]; } return reversed; } }; ``` 在上面的代码中,我们创建了一个MainWindow类,并在其中添加了一个用于输入中缀表达式的文本框、一个用于显示后缀表达式的标签、一个用于显示前缀表达式的标签和一个用于转换的按钮。在按钮的点击事件中,我们调用了infixToPostfix()和infixToPrefix()函数,分别实现中缀表达式后缀表达式前缀表达式的功能。其中,infixToPostfix()函数使用了实现转换过程,infixToPrefix()函数则先将中缀表达式,再调用infixToPostfix()函数,最后再将结果翻回去得到前缀表达式。 这样,我们就实现了一个简单的中缀表达式后缀表达式前缀表达式的图形化界面。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

随风舞落叶殇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值