Status InitStack(LinkStack &S)
{
S=NULL;
return OK;
}
bool StackEmpty(LinkStack S)
{
if(S==NULL)
return false;
else
return true;
}
Status Push(LinkStack &S, SElemType e)
{
LinkStack p;
p=new StackNode;
p->data=e;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S, SElemType &e)
{
LinkStack p;
if(S==NULL) return ERROR;
e=S->data;
p=S;
S=S->next;
delete p;
return OK;
}
SElemType GetTop(LinkStack &S)
{
if(S!=NULL)
return S->data;
}
bool In(char ch)
{
int i=0;
for(i=0;i<7;i++)
{
if(ch==oper[i])
return true;
}
return false;
}
char Precede(char theta1, char theta2){
char f;
if(theta1=='+'||theta1=='-')
{
if(theta2=='*'||theta2=='/'||theta2=='(') f='<';
else f='>';
}
else if(theta1=='*'||theta1=='/')
{
if(theta2=='(') f='<';
else f='>';
}
else if(theta1=='(')
{
if(theta2==')') f='=';
else f='<';
}
else if(theta1==')')
{
f='>';
}
else if(theta1=='#')
{
if(theta2=='=') f='=';
else f='<';
}
return f;
}
char Operate(char first, char theta, char second)
{
int m;
if(theta=='+') m=(first-48)+(second-48)+48;
else if(theta=='-') m=(first-48)-(second-48)+48;
else if(theta=='*') m=(first-48)*(second-48)+48;
else if(theta=='/') m=(first-48)/(second-48)+48;
return m;
}
char EvaluateExpression(char* ch){
char a,b,theta,x;
StackNode *OPND;
StackNode *OPTR;
InitStack(OPND);
InitStack(OPTR);
Push(OPTR,'#');
int i=1;
while(ch[i]!='#'||GetTop(OPTR)!='#'){
if(!In(ch[i])){
Push(OPND,ch[i]);
i++;
}
else{
switch(Precede(GetTop(OPTR),ch[i])){
case'<':
Push(OPTR,ch[i]);
i++;
break;
case'>':
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
case'=':
Pop(OPTR,x);
i++;
break;
}}
}
return GetTop(OPND);
}