#include
#include
#include
using namespace std;
const int MaxSize = 300;
int trans(char *exp_old, char exp_new[])//算法核心:将中缀表达式转化为后缀表达式 ,其中exp_old为原表达式,exp_new为转化后的表达式
{
struct
{
char data[MaxSize];//用于存放运算符
int top;
} op;
int i = 0; //exp_new的下标
int dh = 1;
op.top = -1;
while (*exp_old != '\0')//一直循环直到检测到式子结束
{
switch (*exp_old)//检测输入表达式中的每一个字符
{
case '(':
op.top++;//top就变成了0
op.data[op.top] = *exp_old;//检测到左括号时将左括号装进data数组的第一个元素里面
dh = 1;
exp_old++; break;//完成左括号的入栈之后就开始往后面检测
case ')':
while (op.data[op.top] != '(')
{
exp_new[i] = op.data[op.top];
op.top--; i++;
}
op.top--; exp_old++; dh = 0; break;
case '+':
case '-':
if (dh == 1)
{
if (*exp_old == '-')
op.top++;
op.data[op.top] = '@';
exp_old++; break;
}
while (op.top != -1 && op.data[op.top] != '(')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++;
dh = 0; break;
case '*':
case '/':
while (op.data[op.top] == '*' || op.data[op.top] == '/' || op.data[op.top] == 's')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++;
dh = 0; break;
case '^':
while (op.data[op.top] == '^')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++; dh = 0; break;
case '%':
while (op.data[op.top] == '%')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++;
dh = 0; break;
case ' ': exp_old++; break;
case 's':
case 'S':
if ((*(exp_old + 1) == 'i' || *(exp_old + 1) == 'I') && (*(exp_old + 2) == 'n' || *(exp_old + 2) == 'N'))
{
op.top++;
op.data[op.top] = 's';
exp_old += 3;
dh = 0;break;
}
else
if ((*(exp_old + 1) == 'q' || *(exp_old + 1) == 'Q') && (*(exp_old + 2) == 'r' || *(exp_old + 2) == 'R') && (*(exp_old + 3) == 't' || *(exp_old + 3) == 'T'))
{
op.top++;
op.data[op.top] = 'q';
exp_old += 4;
dh = 0;break;
}
else
{
cout<<"\n有错误符号s";
return 0;
}
case 'c':
case 'C':
if ((*(exp_old + 1) == 'o' || *(exp_old + 1) == 'O') && (*(exp_old + 2) == 's' || *(exp_old + 2) == 'S'))
{
op.top++;
op.data[op.top] = 'c';
exp_old += 3;
dh = 0;break;
}
else
{
cout<<"\n有错误符号s";
return 0;
}
case 'T':
case 't':
if ((*(exp_old + 1) == 'a' || *(exp_old + 1) == 'A') && (*(exp_old + 2) == 'n' || *(exp_old + 2) == 'N'))
{
op.top++;
op.data[op.top] = 't';
exp_old += 3;
dh = 0; break;
}
else
{
cout<<"\n有错误符号s";
return 0;
}
case 'e':
case 'E':
if ((*(exp_old + 1) == 'x' || *(exp_old + 1) == 'X') && (*(exp_old + 2) == 'p' || *(exp_old + 2) == 'P'))
{
op.top++;
op.data[op.top] = 'e';
exp_old += 3;
dh = 0;break;
}
else
{
cout<<"\n有错误符号s";
return 0;
}
case 'a':
case 'A':
if ((*(exp_old + 1) == 'b' || *(exp_old + 1) == 'B') && (*(exp_old + 2) == 's' || *(exp_old + 2) == 'S'))
{
op.top++;
op.data[op.top] = 'a';
exp_old += 3;
dh = 0;break;
}
else
{
cout<<"\n有错误符号s";
return 0;
}
case 'l':
case 'L':
if ((*(exp_old + 1) == 'o' || *(exp_old + 1) == 'O') && (*(exp_old + 2) == 'g' || *(exp_old + 2) == 'G'))
{
op.top++;
op.data[op.top] = 'g';
exp_old += 3;
dh = 0;break;
}
else
if ((*(exp_old + 1) == 'n' || *(exp_old + 1) == 'N'))
{
op.top++;
op.data[op.top] = 'n';
exp_old += 2;
dh = 0;break;
}
else
{
cout<<"\n有错误符号s";
return 0;
}
default:
while (*exp_old >= '0' && *exp_old <= '9')
{
exp_new[i] = *exp_old; i++;
exp_old++;
}
if (*exp_old == '.')
{
exp_new[i] = '.'; i++; exp_old++;
while (*exp_old >= '0' && *exp_old <= '9')
{
exp_new[i] = *exp_old; i++;
exp_old++;
}
}
exp_new[i] = '#'; i++; dh = 0;
}
}
while (op.top != -1)
{
exp_new[i] = op.data[op.top];
i++; op.top--;
}
exp_new[i] = '\0';
return 1;
}
double compvalue(char *exp_new)
{
struct
{
float data[MaxSize];
int top;
} st;
double d, x;
st.top = -1;
while (*exp_new != '\0')
{
switch (*exp_new)
{
case '+':st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];
st.top--; break;
case '-':st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
st.top--; break;
case '*':st.data[st.top - 1] = st.data[st.top - 1] * st.data[st.top];
st.top--; break;
case '/':
if (st.data[st.top] != 0)
st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
else
{
cout<<"\n\t除数不能为零!\n";
return 0;
}
st.top--; break;
case '^':st.data[st.top - 1] = pow(st.data[st.top - 1], st.data[st.top]);
st.top--; break;
case '%':st.data[st.top - 1] = fmod(st.data[st.top - 1], st.data[st.top]);
st.top--; break;
case '@':st.data[st.top] = -(st.data[st.top]);
break;
case 's':st.data[st.top] = sin(st.data[st.top]);
break;
case 'c':st.data[st.top] = cos(st.data[st.top]);
break;
case 'q':
if (st.data[st.top] >= 0)
st.data[st.top] = sqrt(st.data[st.top]);
else
{
cout<<"\n\t开方内的数不能小于零!\n";
return 0;
}
break;
case 'e':st.data[st.top] = exp(st.data[st.top]);
break;
case 't':st.data[st.top] = tan(st.data[st.top]);
break;
case 'a':st.data[st.top] = abs(st.data[st.top]);
break;
case 'g':
if (st.data[st.top]>0)
st.data[st.top] = log10(st.data[st.top]);
else
{
cout<<"\n\tlog10内的数不能小于等于零!\n";
return 0;
}
break;
case 'n':
if (st.data[st.top]>0)
st.data[st.top] = log(st.data[st.top]);
else
{
cout<<"\n\tln内的数不能小于等于零!\n";
return 0;
}
break;
default:
d = 0;
while (*exp_new >= '0' && *exp_new <= '9')
{
d = 10 * d + (*exp_new - '0');
exp_new++;
}
x = 0.1;
if (*exp_new == '.')
{
exp_new++;
while (*exp_new >= '0' && *exp_new <= '9')
{
d = d + x*(*exp_new - '0');
x *= 0.1;
exp_new++;
}
}
st.top++; st.data[st.top] = d;
}
exp_new++;
}
return st.data[st.top];
}
int main(int argc, char* argv[])
{
char exp[300], exp_new[400];
cout << "Please enter:";
while (1)
{
cout << "请输入一个表达式:(按0结束本程序)\n";
cin >> exp;
if (strcmp(exp, "0") == 0)
return 0;
if (trans(exp, exp_new) == 1)
{
double res = compvalue(exp_new);
cout << "=" << res << endl;
}
}
return 0;
}
可以将相关的一组函数封装成一个类的形式,类中提供接口供外部程序使用。
初学者往往喜欢练习花拳绣腿。而根本看不到自己问题的本质。
你的代码的确可以改进,但是就你来说不是胡乱套用什么面向对象的语法,起码是现在,起码是这个项目。你首先优化的应该是代码中那些switch case中大量重复的代码。