表达式求值

表达式求值

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;

}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值