一个有趣的小程序
  • 板块学术版
  • 楼主HYQ1234
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/7/24 21:47
  • 上次更新2023/11/3 07:49:37
查看原帖
一个有趣的小程序
926328
HYQ1234楼主2023/7/24 21:47

我在这里发布一个有意思的小程序
他可以帮你计算一个中缀表达式的值
也可以把中缀表达式转成后缀表达式和前缀表达式 大家有什么针对这个程序意见可以随便提出来
我会根据你们的意见修改程序的awa
废话不多说 下面是代码~

#include <bits/stdc++.h>
using namespace std;

const long long MAXNUM = 1e6 + 5;

typedef struct TreeNode {
    char v[20] = {};
    TreeNode* left;
    TreeNode* right;
} TreeNode, *TreePoint;
TreePoint root = NULL;
char expr_mid[MAXNUM] = {};
long long len = 0;
stack<char> opt_stk;
stack<string> post_stk;
long long priority(char ch);
bool cmp(char ch1, char ch2);
bool isnumber(char ch);
long long tonumber(char ch[20]);
void mid2post();
TreePoint createTree();
long long getValue(char opt, long long lv, long long rv);
long long calculate(TreePoint t);
void preOrder(TreePoint t);
void midOrder(TreePoint t);
void postOrder(TreePoint t);

int main() {
    long long ret = 0;
    cout << "请输入中缀表达式:";
    for (int i = 0; i < 20; ++i)
        cout << "_";
    for (int i = 0; i < 20; ++i)
        cout << "\b";
    fgets(expr_mid, MAXNUM, stdin);
    len = strlen(expr_mid);
    mid2post();
    root = createTree();
switch_again:
    cout << "请选择要进行的操作:\n1.中缀转前缀\n2.输出中缀表达式\n3."
            "中缀转后缀\n4.输出结果(请输入序号)\n_";
    int x = 0;
    cout << "\b";
    cin >> x;
    switch (x) {
    case 1:
        cout << "前缀表达式:";
        preOrder(root);
        break;
    case 2:
        cout << "中缀表达式:";
        midOrder(root);
        break;
    case 3:
        cout << endl << "后缀表达式:";
        postOrder(root);
        break;
    case 4:
        cout << endl << "结果是:";
        ret = calculate(root);
        cout << ret << endl;
        break;
    default:
        cout << "对不起,您输入了错误的序号,请重新输入!" << endl;
        goto switch_again;
    }
    return 0;
}
long long priority(char ch) {
    if (ch == '(')
        return 0;
    if (ch == '+' || ch == '-')
        return 1;
    if (ch == '*' || ch == '/')
        return 2;
    return -1;
}
bool cmp(char ch1, char ch2) {
    return priority(ch1) >= priority(ch2) ? true : false;
}
bool isnumber(char ch) {
    if (ch >= '0' && ch <= '9')
        return true;
    return false;
}
long long tonumber(char ch[20]) {
    long long ret = 0;
    for (long long i = 0; i < strlen(ch); ++i)
        ret = ret * 10 + ch[i] - '0';
    return ret;
}
void mid2post() {
    string str = "";
    for (long long i = 0; i < len; ++i) {
        if (expr_mid[i] == ' ' || expr_mid[i] == '\n' || expr_mid[i] == '\r')
            continue;
        str = "";
        if (expr_mid[i] == '(')
            opt_stk.push(expr_mid[i]);
        if (isnumber(expr_mid[i])) {
            while (isnumber(expr_mid[i]))
                str += expr_mid[i++];
            post_stk.push(str);
            str = "";
        }
        if (expr_mid[i] == ')') {
            while (!opt_stk.empty() && opt_stk.top() != '(') {
                str += opt_stk.top();
                opt_stk.pop();
                post_stk.push(str);
                str = "";
            }
            opt_stk.pop();
        }
        if (expr_mid[i] == '+' || expr_mid[i] == '-' || expr_mid[i] == '*' ||
            expr_mid[i] == '/') {
            while (!opt_stk.empty() && cmp(opt_stk.top(), expr_mid[i])) {
                str += opt_stk.top();
                opt_stk.pop();
                post_stk.push(str);
                str = "";
            }
            opt_stk.push(expr_mid[i]);
            str = "";
        }
    }
    while (!opt_stk.empty()) {
        str += opt_stk.top();
        opt_stk.pop();
        post_stk.push(str);
        str = "";
    }
}
TreePoint createTree() {
    TreePoint tp = NULL;
    string str;
    char v[20];
    while (!post_stk.empty()) {
        tp = (TreePoint)malloc(sizeof(TreeNode));
        str = post_stk.top();
        post_stk.pop();
        strcpy(v, str.c_str());
        strcpy(tp->v, v);
        if (isnumber(v[0])) {
            tp->right = NULL;
            tp->left = NULL;
            return tp;
        } else {
            tp->right = createTree();
            tp->left = createTree();
            return tp;
        }
    }
    return tp;
}
long long getValue(char opt, long long lv, long long rv) {
    long long ret = 0;
    switch (opt) {
    case '+':
        ret = lv + rv;
        break;
    case '-':
        ret = lv - rv;
        break;
    case '*':
        ret = lv * rv;
        break;
    case '/':
        if (rv != 0) {
            ret = lv / rv;
            break;
        } else {
            cout << "divided by zero!" << endl;
            return -1;
        }
    }
    return ret;
}
long long calculate(TreePoint t) {
    if (t != NULL) {
        if (t->left == NULL && t->right == NULL) {
            return tonumber(t->v);
        } else {
            long long ret, lv, rv;
            char opt = (t->v)[0];
            lv = calculate(t->left);
            rv = calculate(t->right);
            ret = getValue(opt, lv, rv);
            return ret;
        }
    }
    return -1;
}
void preOrder(TreePoint t) {
    if (t != NULL) {
        cout << t->v << " ";
        preOrder(t->left);
        preOrder(t->right);
    }
}
void midOrder(TreePoint t) {
    if (t != NULL) {
        midOrder(t->left);
        cout << t->v << " ";
        midOrder(t->right);
    }
}
void postOrder(TreePoint t) {
    if (t != NULL) {
        postOrder(t->left);
        postOrder(t->right);
        cout << t->v << " ";
    }
}

2023/7/24 21:47
加载中...