#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define MaxSize 50
typedef double ElemType;
typedef struct linknode
{
ElemType data;
ElemType postexp[];
ElemType exp[MaxSize];
double *Optr;
struct linknode *next;
}LinkStNode;
void InitStack(LinkStNode*&s)//初始化
{
s=(LinkStNode*)malloc(sizeof(LinkStNode));
s->next=NULL;
}
void DestroyStack(LinkStNode*&s)//销毁
{
LinkStNode *pre=s,*p=s->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next ;
}
free(pre);
}
bool StackEmpty(LinkStNode*s)//判断是否为空
{
return(s->next==NULL);
}
void Push(LinkStNode*&s,double e)//进栈
{
LinkStNode *p;
p=(LinkStNode*)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
}
bool Pop(LinkStNode*&s,double &e)//出栈
{
LinkStNode *p;
if(s->next==NULL)
return false;
p=s->next;
e=p->data;
s->next=p->next ;
free(p);
return true;
}
bool GetTop(LinkStNode*&s,ElemType &e)//取栈顶元素
{
if(s->next==NULL)
return false;
e=s->next->data;
return true;
}
//中缀转后缀
void trans(char *exp,char postexp[])
{
double e;//这里将char换成double
LinkStNode *Optr;
InitStack (Optr);
int i=0;
while(*exp!='\0')
{
switch(*exp)
{
case '(':
Push(Optr,'(');
exp++;
break;
case ')':
Pop(Optr,e);
while(e!='(')
{
postexp[i++]=e;
Pop(Optr,e);
}
exp++;
break;
case '+':
case '-':
while (!StackEmpty(Optr))
{
GetTop(Optr,e);
if(e!='(')
{
postexp[i++]=e;
Pop(Optr,e);
}
else break;
}
Push(Optr,*exp);
exp++;
break;
case '*':
case '/':
while(!StackEmpty(Optr))
{
GetTop(Optr,e);
if(e=='*'||e=='/')
{
postexp[i++]=e;
Pop(Optr,e);
}
else break;
}
Push(Optr,*exp);
exp++;
break;
default:
while(*exp>='0'&&*exp<='9')
{ postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
}
}
while(!StackEmpty(Optr))
{
Pop(Optr,e);
postexp[i++]=e;
}
postexp[i]='\0';
DestroyStack(Optr);
}
double compvalue(char *postexp)
{
double d,a,b,c,e;
LinkStNode *Opnd;
InitStack(Opnd);
while(*postexp!='\0')
{
switch(*postexp)
{
case '+':
Pop(Opnd,a);
Pop(Opnd,b);
c=b+a;
Push(Opnd,c);
break;
case'-':
Pop(Opnd,a);
Pop(Opnd,b);
c=b-a;
Push(Opnd,c);
break;
case'*':
Pop(Opnd,a);
Pop(Opnd,b);
c=b*a;
Push(Opnd,c);
break;
case'/':
Pop(Opnd,a);
Pop(Opnd,b);
if(a!=0)
{
c=b/a;
Push(Opnd,c);
break;
}
else
{
printf("\n\t除零错误!\n");
exit(0);
}
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+*postexp-'0';
postexp++;
}
Push(Opnd,d);
break;
}
postexp++;
}
GetTop(Opnd,e);
DestroyStack(Opnd);
return e;
}
bool Match(char exp[],int n)
{
int i=0;
ElemType e;
bool match=true;
LinkStNode *s;
InitStack(s);
while(i<n&&match)
{
if(exp[i]=='(')
Push(s,exp[i]);
else if(exp[i]==')')
{
if( GetTop(s,e)==true)
{
if(e!='(')
match=false;
else{
Pop(s,e);
}
}
else match=false;
}
i++;
}
if(!StackEmpty(s))
match=false;
DestroyStack(s);
return match;
}
int main()
{ ElemType e;
char exp[MaxSize];
while(Match!=false)
{
printf("请输入一个中缀表达式:\n") ;
scanf("%s",&exp);
if(Match(exp,10)==false)
printf("括号不是配对的\n");
else
{
printf("括号是配对的\n");
char postexp[MaxSize];
trans(exp,postexp);
printf("中缀表达式:%s\n",exp);
printf("后缀表达式:%s\n",postexp);
printf("表达式的值为:%g\n",compvalue(postexp));
return 1;
}
}
}