算数表达式的计算——Expression 类与stack混合的实现

//*************************************************************************************************************************
//算数表达式计算
//实现正整数的+-*/运算.
//*************************************************************************************************************************

#include <iostream.h>
#include<string.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>

//*************************************************************************************************************************
//类模版定义


template <class T>
class Expression
{
 private:
  T *base;
     T *top;
     int stacksize;

 public:
  Expression();//建立一个新栈
  Push(T e);//压入一个新数据
  GetTop();//取得最上面的数据
  Pop();//弹出最上面的数据
};


template <class T>
Expression <T>::Expression()
{
 base = (T*)malloc(100*sizeof(T));
 if(!base)
  exit (0);//分配内存失败
 top=base;
 stacksize = 100;
}


template <class T>
int Expression <T>::GetTop()
{
 T e;
 if(top==base)
  return 0;//栈空的情况
 e=*(top-1);
 return e;
}


template <class T>
int Expression <T>::Pop()
{
 T e;
 if(top==base)
  return 0;//栈空的情况
 e=* --top;
 return e;
}


template <class T>
int Expression <T>::Push(T e)
{
 if(top-base>=stacksize)//栈满的情况
 {
    cout<<"空间不足!!"<<endl; 
    exit (0);//空间分配失败
 
 }
 *top++=e;
 return 1;
}


/*class Expreesion
{
private:
 SqStack<int> r;
 int result ;
public:
 Expreesion()
 {
  this->result=r.GetTop
 }
 int store()

 {
   return result;
 }
}

*/
//************************************************************************************************************************
//基本函数定义
char del()   //去除前导空格函数
{   char c;
 c=getchar();
 while(c==' ')
 {
  c=getchar();
 }
 return c;
}

int Isnum(char e)//判断是否是数字
{
 if(e>='0'&&e<='9')
  return 1;
 else
  return 0;
}


int Primary(char x)//返回符号对应的数值
{
 int e=-1;
 switch (x)
 {
 case '+':  e=0;break;
 case '-':  e=1;break;
 case '*':  e=2;break;
 case '/':  e=3;break;
 case '(':  e=4;break;
 case ')':  e=5;break;
 case '#':  e=6;break;
 case '=':  e=6;break;
 }
 
 if(e==-1)
 { 
  cout<<"输入表达式含不规范字符!" <<endl;
     exit(0);
 }
 return e;

}


int Precede(char x,char y) //符号优先级定义
{
 int num[7][7]={{1,1,-1,-1,-1,1,1},
     {1,1,-1,-1,-1,1,1},
     {1,1,1,1,-1,1,1},
     {1,1,1,1,-1,1,1},
     {-1,-1,-1,-1,-1,0,2},
     {1,1,1,1,2,1,1},
     {-1,-1,-1,-1,-1,2,0}};
 int a,b;
 a = Primary(x);
 b = Primary(y);
 return num[a][b];
}


int Operate(int a ,char op ,int b )
{
 if (op =='+')
  return (a+b);
 if (op =='-')
  return (a-b);
 if (op =='*')
  return (a*b);
 if (op =='/')
  return (a/b);
}


void Cal()
{
 Expression <int> OPND;//操作数栈
 Expression <char> OPTR;//运算符栈
 char c,d;
 int num;
 //c=del();
 OPTR.Push('#');//将#压入运算符栈
// cout<<"/t/tOPTR 进栈:  "<<c<<endl;
 c=del();

 while (c!='='||OPTR.GetTop()!='#')
 {
  
  if(Isnum(c)) 
  {
   num = int(c-48);
   d=del();//读入下一字符
   while(Isnum(d))
   {   
    num = 10*num + int(d-48);
    d=del();
   }

   OPND.Push(num);
   cout<<"/t/t/t进栈:  "<<num<<endl;
   c=d;
  }

  else
   switch(Precede(OPTR.GetTop(),c))
  {
   
   case -1://栈顶元素优先级低
    OPTR.Push(c);
    cout<<"/t/t/t进栈:  "<<c<<endl;
    c=del();
    break;

   case 0://脱括号并接收下一字符
    OPTR.Pop();
    c=del();
    break;

   case 1://退栈并将运算结果入栈
    char op;
    int a ,b;
    op=OPTR.Pop();
    b=OPND.Pop();
    a=OPND.Pop();
    cout<<"/t/t/t/t出栈:  "<<op<<endl;
    cout<<"/t/t/t/t出栈:  "<<a<<" , "<<b<<endl;
    cout<<"/t/t/t/t计算:  "<<a<<op<<b<<endl;
    OPND.Push(Operate(a,op,b));
    break;

   case 2://输入错误的情况
    cout<<"输入表达式错误!"<<endl;
    exit(0);
    break;

  }//switch
 }//while
 cout<<"/t**************************************************************";
 cout<<" /t/t/t/t/t/t最后的结果为: "<<OPND.GetTop();
}


//*******************************************************************************************************************


void main()   //定义主函数
{
 cout<<"请输入表达式:"<<endl;
 cout<<"/t例子: (14*(9/3))-32= "<<endl;
 cout<<"/t(可以包含任意数量前导空格)"<<endl;
 cout<<"请输入表达式:"<<endl;
 Cal() ;
    cout<<endl;
 system("pause");
}

 

你可能感兴趣的:(算数表达式的计算——Expression 类与stack混合的实现)