算术表达式求值

本文介绍了一种使用栈的数据结构来解析和计算数学表达式的方法。通过定义运算符栈和操作数栈,实现了表达式的读取、运算符的优先级判断及最终结果的计算。


#include<iostream>
using namespace std;
#define Stack_Init_Size 100  //存储空间初始化分配量
#define Stack_Increment  10  //存储空间分配增量
#define error 0 
typedef struct
{
 float *base;             
 float *top;            //栈里的所有数据都是以float型存储的  
 int  stacksize;          //当前已分配的存储空间大小
}SqStack;
void InitStack(SqStack &S)   //构造一个空栈
{
 S.base=(float *)malloc(Stack_Init_Size*sizeof(float));
 if(!S.base)
  cout<<"分配失败"<<endl;      //分配失败
 S.top=S.base;
 S.stacksize=Stack_Init_Size;
}
float GetTop(SqStack S)       //若栈非空,返回运算符栈栈顶元素
{
 if(S.top==S.base)    return error;
     return *(S.top-1);    
}
void AddSpace(SqStack &S)    //增加空间
{
 S.base=(float*)realloc(S.base,(S.stacksize+Stack_Increment)*sizeof(float));
 if(!S.base) cout<<"分配空间失败"<<endl;
 S.top=S.base+S.stacksize;          //top指针退回到正确位置
 S.stacksize+=Stack_Increment;
}
void Push(SqStack &S,float e)   //插入运算符
{
 if(S.top-S.base>=S.stacksize)//栈满则追加存储空间
  AddSpace(S);
 *S.top++=e;        //将运算数压入栈顶
}
void Pop(SqStack &S,float &e)  //运算符出栈,用e返回栈顶元素的值
{
 if(S.top==S.base)
  cout<<"error:运算数栈为空栈"<<endl;
 e=*--S.top;

}
int In(float c)     //判断c是否是运算符,如果是则返回1,不是则返回0
{
 if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')
  return 1;
 else return 0;
}
char Precede(float e,char b)   //运算符优先级的比较函数,e,a代表栈顶运算符,b代表将要压栈的运算符
{
    char a=(char)e;
 char result;
 switch(a)
 {
  case '+':
  if(b=='*'||b=='/'||b=='(')
   result='<';
  else result='>';
  break;
 case '-':
  if(b=='*'||b=='/'||b=='(')
   result='<';
  else result='>';
  break;
 case '*':
  if(b=='(')
   result='<';
  else result='>';
  break;
 case '/':
  if(b=='(')
   result='<';
  else result='>';
  break;
 case '(':
  if(b==')')
   result='=';
  else if(b=='=')
   cout<<"输入错误"<<endl;
  else result='<';
  break;
 case ')':
  if(b=='(')
   cout<<"输入错误"<<endl;
  else result='>';
  break;
 case '=':
  if(b==')')cout<<"输入错误"<<endl;
  else if(b=='=')   result='=';
  else result='<';
  break;
 }
 return result;
}

float Operate(float a,float e,float b)   //二元运算a c b,并返回结果
{
 char c=(char)e;
 float result;
 switch(c)
 {
    case '+':
     result=a+b;
     break;
    case '-':
     result=a-b;
     break;
    case '*':
     result=a*b;
     break;
    case '/':
     result=a/b;
     break;
 }
 return result;
}

float EvaluateExpression()   //主要算法,OPTR为运算符栈,OPND为运算数栈
{
 SqStack OPTR,OPND;
 InitStack(OPTR);  Push(OPTR,'=');
 InitStack(OPND);
 char c=getchar();
 float J=1,e,y,x,m;
 float a,b,theta;//a,b为需要运算的运算数,theta为运算符
 int q=0;
 while(c!='='||GetTop(OPTR)!='=')
 {
  if(!In(c))
  {
   if(c!='.')  //如果下一个字符C不是小数点,则将c压入运算数栈
   {
      x=(int)(c-'0'); //转换格式将字符型c转换为int型,存放在x中
      if(J==1)
      {
       Push(OPND,x);
      }
      else
    if(J>1)
    {
     Pop(OPND,e);
                    e=e*J+x;
     J*=10;
     Push(OPND,e);
    }
       else
    {
     Pop(OPND,e);
     e+=x*J;
     J=J*0.1;
     Push(OPND,e);
    }
   }
      else
    J=0.1;
   c=getchar();
   
  }            
  else
  {
   if(q)
   {
                Pop(OPND,e);
    e=0-e;
                Push(OPND,e);

   }
            J=1;
   float m=c;
   switch(Precede(GetTop(OPTR),m))
   {
   case '<':               //栈顶元素的优先级低
    Push(OPTR,m);   //将新的运算符压入栈顶
    c=getchar();
    break;
    
   case '=':               //此时为一对括号,脱去括号,并接收下一个字符
    Pop(OPTR,x);
    c=getchar();
    break;
   case '>':              //退栈,并将运算结果入栈
    Pop(OPTR,theta);
    Pop(OPND,b);
    Pop(OPND,a);
    Push(OPND,Operate(a,theta,b));
    break;
    
   }
   if(m=='('&&c=='-')
   {
    q=1;
    c=getchar();                
   }
   else
    q=0;
  }
  
 }
 return GetTop(OPND);
}
int main()

 
 cout<<"请输入算术表达式:"<<endl;
 float result=EvaluateExpression();
 cout<<"结果为:"<<result<<endl;
 return 0;
}

 

转载于:https://www.cnblogs.com/zjcnblogs/archive/2009/07/22/1528392.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值