在考研复习过程中,我发现严书上给出的代码非常不易于理解,并且搜索引擎搜到的一些博客所写的代码实在是一言难尽。所以在此更新一些根据我自己的理解写的代码,希望可以帮助到初学者以及正在复习数据结构的人。同时也希望大家可以重视代码的规范性,提高代码的可阅读性。一定要做到见名知意。不要写出类似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];
}