功能是表达式求值
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<math.h>
#include<string.h>
struct sqstack{
int data[100];
int top;
};
void init_stack(sqstack *s)
{s->top=-1;}
void push_stack(sqstack *s,char x)
{s->top++;
s->data[s->top]=x;}
void pop_stack(sqstack *s,int *x)
{*x=s->data[s->top];s->top--;}
int gettop(sqstack *s)
{return s->data[s->top];}
//------------------定义操作符-----------------
char op[8]={'(',')','+','-','*','/','^','%'};
//---------------判断是否是操作符-------------
int in(char c,char op1[])
{int i=0,j;
while(op1[i]=='/0')
{if(c==op1[i])
{j=1;}
else
j=0;
i++;}
return j;
}
//----------------栈外级别--------------------
int you1(char a)
{int i;
switch(a)
{case'+':i=1;break;
case'-':i=1;break;
case'/':i=2;break;
case'*':i=2;break;
case'^':i=4;break;
case'(':i=4;break;
case')':i=-1;break;}
return i;
}
//----------------栈内级别--------------------
int you(char a)
{int j;
switch(a)
{case'+':j=1;break;
case'-':j=1;break;
case'/':j=2;break;
case'*':j=2;break;
case'^':j=3;break;
case'(':j=-1;break;
case')':j=-1;break;}
return j;
}
//------------比较两个的优先级---------------
char precede(char s,char c)
{if(you(s)==you1(c))
return '=';
else if(you(s)>you1(c))
return '>';
else return'<';
}
//-------------根据运算计算数据--------------
int operate(int a1,int theta,int b1)
{int ans=0;
switch(theta)
{ case '+':ans=a1+b1; break;
case '-':ans=a1-b1; break;
case '*':ans=a1*b1; break;
case '/':ans=a1/b1;break;
case '^':ans=int(pow(a1,b1));break;}
return ans;
}
int transform(char s)//字符型数据转化为整形数据
{ int i;i=int(s);
return i;}
char evaluateexpression(char c)
{sqstack *optr,*opnd;
optr=(sqstack*)malloc(sizeof(sqstack));
opnd=(sqstack*)malloc(sizeof(sqstack));
int theta,x,a,b;
init_stack(optr);
push_stack(optr,'(');
init_stack(opnd);
c=getchar();
while(c!='#')
{if(!in(c,op))
{int i;
i=transform(c);
push_stack(opnd,i);c=getchar();}
else
switch(precede(gettop(optr),c))
{case'<':push_stack(optr,c);
c=getchar();
break;
case'=':if(c==')')
{pop_stack(optr,&x);
c=getchar();
break;}
case'>':pop_stack(optr,&theta);
pop_stack(opnd,&b);
pop_stack(opnd,&a);
push_stack(opnd,operate(a,theta,b));
break;}
}
if(gettop(optr)!='(')
{pop_stack(optr,&theta);
pop_stack(opnd,&b);
pop_stack(opnd,&a);
push_stack(opnd,operate(a,theta,b));
}
return gettop(opnd);
}
void main()
{char c;
cout<<"请输入表达式,并以#结束:"<<endl;
c=getchar();
cout<<evaluateexpression(c);
}