//计算正整数算术表达式可分两个步骤1)将中缀表达式转换成后缀表达式;2)计算后缀表达式的值
#include <iostream>
using namespace std;
#define Maxsize 20
//1)将中缀表达式转换成后缀表达式;
void trans(char *exp,char postexp) //将exp转换成postexp
{
struct
{
char data[Maxsize];//
int top;//栈指针
}op;//运算符栈
int i=0;//postexp的下标
op.top=-1;
while(*exp!=' ')
{
switch(*exp)
{
case'(':
op.top++;op.data[op.top]=*exp;
exp++;
break;
case')':
while(op.data[op.top]!='(')//查找运算符栈顶是否为除(外的其他运算符
{ postexp[i++]=op.data[op.top];//存在,则逐个出栈存在postexp中
op.top--;
}
op.top--;//直到在运算符栈中遇到(,则将(出栈
exp++;//继续扫描exp
break;
case'+':
case'-'://判断栈是否为空以及(前是否存在其他运算符
while(op.top!=-1 && op.data[op.top]!='(')
{ post[i++]=op.data[op.top];//存在则将运算符保存在postexp中
op.top--;
}
op.top++;
op.data[op.top]=*exp;
exp++;
break;
case'*':
case'/'://判断运算符栈中是否存在*或者/
while(op.data[op.top]=='*'||op.data[op.top]=='/')//保存新遇到的*或者/之前,先将已有的*或者/出栈存在postexp中
{ postexp[i++]=op.data[op.top];
op.top--;
}
op.top++;//将新的*或者/存在运算符栈中
op.data[op.top]=*exp;
exp++;
break;
case' ':break;//过滤掉空格
default://处理数字字符
while(*exp>='0' && *exp<='9')
{postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
}
}
while(op.top!=-1)//扫描完exp,将运算符栈中剩余的字符逐个出栈保存在postexp中
{ postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]=' ';//给postexp结束标识符
}
//2)计算后缀表达式的值
float compvalue(char *postexp)
{
struct
{
float data[Maxsize];
int top;
}st;
float a,b,c,d;
st.top=-1;
while(*postexp!=' ')
{
switch(*postexp)
{
case'+':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b+a;
st.top++;
st.data[st.top]=c;
break;
case'-':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b-a;
st.top++;
st.data[st.top]=c;
break;
case'*':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b*a;
st.top++;
st.data[st.top]=c;
break;
case'/':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
if(a)
{
c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{
cout<<"除零错误!"<<endl;
exit(0);
}
break;
default:
d=0;
while(*postexp>='0' && *postexp<='9')
{ d=10*d+*postexp-'0';
postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++;
}
return(st.data[st.top]);
}
//调用函数,测试表达式可由键盘输入
void main()
{
char exp[Maxsize];//"6+3*(1+3*4)";
cout<<"请输入中缀表达式:";
cin>>exp;
char postexp[Maxsize];
trans(exp,postexp);
float val;
val=compvalue(postexp);
cout<<"中缀表达式:"<<exp<<endl;
cout<<"后缀表达式"<<postexp<<endl;
cout<<"表达式的值:"<<val<<endl;
system("pause");
}