用栈实现10 以内的简单表达式求值

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
//分别创建储存数字和操作数的栈 
typedef struct
{
double data[1000];
int top;
}stackopnd;


typedef struct
{
char str[100];
int top;
}stackoptr;
 
char prior[7][7]={'>','>','<','<','<','>','>',
                  '>','>','<','<','<','>','>',     
                  '>','>','>','>','<','>','>',
                  '>','>','>','>','<','>','>',
                  '<','<','<','<','<','=','E',
                  '>','>','>','>','E','>','>',
                  '<','<','<','<','<','E','='};


void initopnd(stackopnd &s)
{
s.top=-1;
}


void initoptr(stackoptr &s)
{
s.top=-1;
}


void pushopnd(stackopnd &s,double e)
{
s.top++;
s.data[s.top]=e;
}


void pushoptr(stackoptr &s,char e)
{
s.top++;
    s.str[s.top]=e;
}


double gettopopnd(stackopnd s)
{
    double e;
e=s.data[s.top];
return e;
}


char gettopoptr(stackoptr s)
{
char e;
e=s.str[s.top];
return e;
}


void popopnd(stackopnd &s,double &e)
{
e=s.data[s.top];
s.top--;
}


void popoptr(stackoptr &s,char &e)
{
e=s.str[s.top];
s.top--;
}


double operate(double a,char theta,double b)
{
char op[4]={'+','-','*','/'};
int i;
for(i=0;i<4;i++)
{
if(theta==op[i])
break;
}
switch(i)
{
case 0:return a+b;
case 1:return a-b;
case 2:return a*b;
case 3:return a/b;
}
}


//判断字符c是否是操作符
bool In(char c)
{
      char op[8]={'+','-','*','/','(',')','#'};
      int i,f=0;
      for(i=0;i<7;i++)
      {
      if(c==op[i])
      {
      f=1;
      break;
}
}
  if(f==0)
  return false;
  else
  return true;
}


//判断两个操作符的优先级 
char precede(char a,char b)
{
char op[8]={'+','-','*','/','(',')','#'};
int i,j;
for(i=0;i<8;i++)
{
if(a==op[i])
         break;
}
for(j=0;j<8;j++)
{
if(b==op[j])
         break;
}
return prior[i][j];
}


double caculate()
{
    stackoptr optr;
    stackopnd opnd;
double a,b,c1;
char theta,c,x;
initoptr(optr);pushoptr(optr,'#');   //初始化栈,并把'#'压入栈底 
initopnd(opnd);c=getchar();
while(c!='#'||gettopoptr(optr)!='#')
{
if(!In(c))   //c是数字,就存入opnd 中 
{
c1=c-'0';
pushopnd(opnd,c1);
c=getchar();
}
else
switch(precede(gettopoptr(optr),c))   
{
case '<':
pushoptr(optr,c);c=getchar();
break;
case '=':
popoptr(optr,x);c=getchar();
break;
case '>':
    popoptr(optr,theta);
popopnd(opnd,b);popopnd(opnd,a);
pushopnd(opnd,operate(a,theta,b));
break;
}
}
return gettopopnd(opnd);
}
int main()
{
while(1)
{
cout<<caculate()<<endl;
         system("PAUSE");
         system("CLS");     
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/zhangmengwen/article/details/80143193