表达式求值
1、掌握栈的特性,能利用栈的特性进行实际应用。
2、掌握“运算符优先法”,并能利用该算法对表达式求值。
1、求一个表达式的值:输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法表达式,计算该表达方式的运算结果。
2、有能力的同学可以考虑操作数为多位浮点数的情况。
3、所写源代码编程风格良好,有详细注释。
4、程序运行界面良好。
#include<iostream>
#include<string.h>
using namespace std;
#define SIZE 20
typedef struct stack1
{ char s[SIZE];
int top;
int base;
}st1;
typedef struct stack2
{ float s[SIZE];
int top;
int base;
}st2;
char A[7][7]={ {'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','
'},
{'>','>','>','>','
','>','>'},
{'<','<','<','<','<','
','='},
};
char B[7]={'+','-','*','/','(',')','#'};
int search(char c)
{ int i=0;
while(c!=B[i]) {i++;}
return(i);
}
char Precede(char c1,char c2)
{ int i,j;
i=search(c1);
j=search(c2);
return(A[i][j]);
}
void initStack1(stack1
*st)
{ st->top=st->base=0;
}
void initStack2(stack2
*st)
{ st->top=st->base=0;
}
char gettop1(stack1 st)
{ if (st.top==st.base) return('!');
else
return(st.s[st.top-1]);
}
float gettop2(stack2 st)
{ if (st.top==st.base) return('!');
else return(st.s[st.top-1]);
}
void push1(stack1 *st,char c)
{ st->s[st->top]=c;
st->top++;
}
void push2(stack2 *st,float c)
{ st->s[st->top]=c;
st->top++;
}
char pop1(stack1 *st)
{ if (st->top==st->base) return('!');
else { st->top--;
return(st->s[st->top]);
}
}
float pop2(stack2 *st)
{ if (st->top==st->base) return('!');
else { st->top--;
return(st->s[st->top]);
}
}
float SwitchCtoF(char num[],int flag)
{
char
Integral[20]="0",decimal[20]="0";
int
ilen=0,dlen=0,i=0;
float s=0;
for(;num[i]!='\0';i++)
{
if(i>ilen)
{decimal[dlen]=num[i]; dlen++;}
else
if(num[i]!='.') {Integral[ilen]=num[i]; ilen++;}
}
float weight=1;//整数位权值
for(i=ilen-1;i>=0;i--)
{
int
a=(Integral[i]-'0')*weight;
s+=a;
weight*=10;//逐渐增大10倍
}
weight=(float)0.1;//小数位权值
for(i=0;i<dlen;i++)
{
float
b=(decimal[i]-'0')*weight;
s+=b;
weight*=(float)0.1;//逐渐减小10倍
}
if(flag==0)return
s;
else return (-s);
}
float Calculate(float a,float b,char c)
{
float s=0;
switch(c)
{
case '+':s=a+b;break;
case
'-':s=a-b;break;
case
'*':s=a*b;break;
case
'/':s=a/b;break;
default:break;
}
return s;
}
void EvaluateExpression()
{
st1 optr;
st2 opnd;
initStack1(&optr);initStack2(&opnd);
push1(&optr,'#');
char num[SIZE*10];
float result=0;
cout<<"请输入表达式:"<<endl;
cin>>num;
strcat(num,"#");
char figure[20];
int flen=0,flag=0;
for(int
i=0;num[i]!='\0';i++)
{ if((num[i]>='0'&&num[i]<='9')||num[i]=='.'||(num[i]=='-'&&(num[i-1]<'0'||num[i-1]>'9'||i==0)))
{
if(num[i]=='-')
flag=1;
else
{
figure[flen]=num[i];
flen++;
figure[flen]='\0';
}
}
else
{
if(flen!=0){push2(&opnd,SwitchCtoF(figure,flag));
flen=0;flag=0;}
float
x=gettop2(opnd);
if(Precede(gettop1(optr),num[i])=='<')
{
push1(&optr,num[i]);
}
else
if(Precede(gettop1(optr),num[i])=='>')
{
while(Precede(gettop1(optr),num[i])=='>')
{
float
b=pop2(&opnd);
float
a=pop2(&opnd);
result=Calculate(a,b,pop1(&optr));
push2(&opnd,result);
}
if(Precede(gettop1(optr),num[i])!='=')
push1(&optr,num[i]);
else
pop1(&optr);
}
else
pop1(&optr);
}
}
cout<<"="<<result<<endl;
cout<<endl;
}
int main()
{
while(1)
EvaluateExpression();
return 0;
}