表达式求值
//1。若ch为数字,将后续的所有数字均依次存入数组exp中,并以字符#标志数值串结束
//2。若ch为左括号'(',则将此括号入栈op
//3。若ch为右括号')',则将栈op中'('以前的字符依次删除并存入数组exp中,然后将左括号'('删除
//4。若ch为'+'或'-', 则将栈op中'('以前的字符(运算符)依次删除并存入数组exp中,然后将ch入栈op中
//5。若ch为'*'或'/',则将当前栈op中的栈顶端连续的'*'或'/'删除,并依次存入数组exp中,然后将ch入栈op
//6。若扫描完毕,则将栈op中的所有运算符依次删除并存入数组exp中,然后再将ch存入数组exp中
#include <iostream.h>
#define MaxSize 50
void trans(char str[], char exp[]);
float compvalue(char exp[]);
int main()
{
char str[MaxSize],exps[MaxSize];
cout<<"输入一个表达式:"<<endl;
gets(str);
cout<<"原表达式为:"<<str<<endl;
trans(str,exps);
cout<<"后缀表达式为:"<<exps<<endl;
cout<<"计算结果为: "<<compvalue(exps)<<endl;
getchar();
getchar();
}
void trans(char str[], char exp[])
{
struct
{
char data[MaxSize];
int top;
}op;
char ch;
int i=0,t=0;
op.top=-1;
ch=str[i];
i++;
while(ch!='\0')
{
switch(ch)
{
case '(':
op.top++; op.data[op.top]=ch;
break;
case ')':
while(op.data[op.top]!='(')
{
exp[t]=op.data[op.top];
op.top--;
t++;
}
op.top--;
break;
case '+':
case '-':
while(op.top!=-1&&op.data[op.top]!='(')
{
exp[t]=op.data[op.top];
op.top--;
t++;
}
op.top++; op.data[op.top]=ch;
break;
case '*':
case '/':
while(op.top!=-1&&(op.data[op.top]=='*'||op.data[op.top]=='/'))
{
exp[t]=op.data[op.top];
op.top--;
t++;
}
op.top++; op.data[op.top]=ch;
break;
case ' ': break;
default:
while(ch>='0'&&ch<='9')
{
exp[t]=ch; t++;
ch=str[i]; i++;
}
i--;
exp[t]='#'; t++;
}
ch=str[i];i++;
}
while(op.top!=-1)
{
exp[t]=op.data[op.top];
t++;
op.top--;
}
exp[t]='\0';
}
float compvalue(char exp[])
{
struct
{
float data[MaxSize];
int top;
}st;
float d;
char ch;
int t=0;
st.top=-1;
ch=exp[t]; t++;
while(ch!='\0')
{
switch(ch)
{
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<<"除0出错"<<endl;
exit(0);
}
st.top--; break;
default:
d=0;
while(ch>='0'&&ch<='9')
{
d=10*d+ch-'0';
ch=exp[t];
t++;
}
st.top++;
st.data[st.top]=d;
}
ch=exp[t];
t++;
}
return st.data[st.top];
} 



浙公网安备 33010602011771号