我在这里发布一个有意思的小程序
他可以帮你计算一个中缀表达式的值
也可以把中缀表达式转成后缀表达式和前缀表达式
大家有什么针对这个程序意见可以随便提出来
我会根据你们的意见修改程序的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 << " ";
}
}