#include<stdio.h>
#define TRUE 1
#define FALSE 0
typedef int Element;
typedef struct Node
{
Element data;
struct Node *next;
} StackNode,*LinkStack;
//初始化
LinkStack InitLinkStack(LinkStack top)
{
top = (LinkStack)malloc(sizeof(StackNode));
top->next=NULL;
return top;
}
int PushLinkStack(LinkStack top,Element x)
{
LinkStack p;
p=(LinkStack)malloc(sizeof(StackNode));
if(!p)return FALSE;
p->data=x;
p->next=top->next;
top->next=p;
}
int PopLinkStack(LinkStack top,Element *x)
{
LinkStack p;
if(top->next==NULL)return FALSE;
p=top->next;
*x=p->data;
top->next=p->next;
free(p);
return TRUE;
}
char getTop(LinkStack top)
{
if(top->next)
return top->next->data;
return '.';
}
int IsEpty(LinkStack S)
{
if(!S->next)return TRUE;
return FALSE;
}
int getint(char a)
{
int i;
switch(a)
{
case '+':
i = 0;
break;
case '-':
i = 1;
break;
case 'x':
i = 2;
break;
case '/':
i = 3;
break;
case '(':
case '[':
i = 4;
break;
case ')':
case ']':
i = 5;
break;
case '@':
i = 6;
break;
}
return i;
}
int priority(char a,char b)
{
int prio[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,3,
1,1,1,1,3,1,1,
-1,-1,-1,-1,-1,3,0
};
return prio[getint(a)][getint(b)];
}
void pri(StackNode p)
{
while(p.next)
{
p=*(p.next);
printf("%d ",p.data);
}
printf("\n");
}
int main()
{
int i,j,p,a,b,num;
char str[100],d;
LinkStack op,optr;
op=InitLinkStack(op);
optr=InitLinkStack(optr);
gets(str);
PushLinkStack(optr,'@');
for(i=0; ; i++)
{
if(IsEpty(optr))break;
if(str[i]>='0'&&str[i]<='9')
{
num=(int)(str[i]-48);
for(j=i+1;; j++)
{
if(str[j]<'0'||str[j]>'9')break;
num*=10;
num+=(int)(str[j]-48);
}
i=j-1;
PushLinkStack(op,num);
}
else
{
p=priority(getTop(optr),str[i]);
if(p==-1)
PushLinkStack(optr,str[i]);
else if(p==1)
{
if(getTop(optr)!='@')
{
a=0;b=0;
PopLinkStack(op,&a);
PopLinkStack(op,&b);
PopLinkStack(optr,&d);
switch(d)
{
case '+':
a=b+a;
break;
case '-':
a=b-a;
break;
case 'x':
a=b*a;
break;
case '/':
a=b/a;
break;
}
PushLinkStack(op,a);
}
if(priority(getTop(optr),str[i])==0)
PopLinkStack(optr,&d);
else
i--;
}
else if(p==0)
{
PopLinkStack(optr,&d);
}
}
}
PopLinkStack(op,&a);
printf("%d",a);
}
表达式求值
最新推荐文章于 2024-08-11 10:17:51 发布