#include<stdio.h>
#include<stdlib.h>
#define MaxOp 128
#define MaxSize 128
#define Size 128
struct //设å®è¿ç®ç¬¦ä¼å
级
{
char ch; //è¿ç®ç¬¦
int pri; //ä¼å
级
}
lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
int leftpri(char op) //æ±å·¦è¿ç®ç¬¦opçä¼å
级
{
int i;
for(i=0;i<MaxOp;i++)
if(lpri[i].ch==op)
return lpri[i].pri;
}
int rightpri(char op) //æ±å³è¿ç®ç¬¦opçä¼å
级
{
int i;
for(i=0;i<MaxOp;i++)
if(rpri[i].ch==op)
return rpri[i].pri;
}
int InOp(char ch) //å¤æchæ¯å¦ä¸ºè¿ç®ç¬¦
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else
return 0;
}
int Precede(char op1,char op2) //op1åop2è¿ç®ç¬¦ä¼å
级çæ¯è¾ç»æ
{
if(leftpri(op1)==rightpri(op2))
return 0;
else if(leftpri(op1)<rightpri(op2))
return -1;
else return 1;
}
void trans(char *exp,char postexp[])
//å°ç®æ¯è¡¨è¾¾å¼exp转æ¢ä¸ºåç¼è¡¨è¾¾å¼postexp
{
struct
{
char data[MaxSize]; //åæ¾è¿ç®ç¬¦
int top; //æ æé
}op; //å®ä¹è¿ç®ç¬¦æ
int i=0; //iä½ä¸ºpostexpçä¸æ
op.top=-1;
op.top++; //å°'='è¿æ
op.data[op.top]='=';
while(*exp!='\0') //exp表达å¼æªæ«æå®æ¶å¾ªç¯
{
if(!InOp(*exp)) //为æ°åå符çæ
åµ
{
while(*exp>='0'&&*exp<='9') //å¤å®ä¸ºæ°å
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#'; //ç¨#æ å¿ä¸ä¸ªæ°å¼ä¸²çç»æ
}
else
switch(Precede(op.data[op.top],*exp))
{
case -1: //æ 顶è¿ç®ç¬¦çä¼å
级ä½
op.top++;op.data[op.top]=*exp;
exp++; //继ç»æ«æå
¶ä»å符
break;
case 0: // åªææ¬å·æ»¡è¶³è¿ç§æ
åµ
op.top--; //å°éæ
exp++;
break;
case 1:
postexp[i++]=op.data[op.top];
op.top--;
break;
}
}
while(op.data[op.top]!='=') //æ¤æ¶expæ«æå®æ¯ï¼éæ å°'='为æ¢
{
postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0'; //ç»postexp表达å¼æ·»å ç»ææ å¿
}
float compvalue(char *postexp) //计ç®åç¼è¡¨è¾¾å¼postexpçå¼
{
struct
{
float data[MaxSize]; //åæ¾æ°å¼
int top; //æ æé
}st;
float d,a,b,c;
st.top=-1;
while(*postexp!='\0') //postexpå符串æªæ«æå®æ¶å¾ªç¯
{
switch(*postexp)
{
case '+':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a+b;
st.top++;
st.data[st.top]=c;
break;
case '-':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b-a;
st.top++;
st.data[st.top]=c;
break;
case '*':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a*b;
st.top++;
st.data[st.top]=c;
break;
case '/':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
if(a!=0)
{
c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{
printf("\n\té¤é¶éè¯¯ï¼ \n");
exit(0);
}
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+*postexp-'0';
postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++;
}
return(st.data[st.top]);
}
void main()
{
for(;;)
{
char exp[Size];
char postexp[MaxSize];
printf("请è¾å
¥è¡¨è¾¾å¼:");
gets(exp);
trans(exp,postexp);
printf("ä¸ç¼è¡¨è¾¾å¼: %s\n",exp);
printf("åç¼è¡¨è¾¾å¼: %s\n",postexp);
printf("表达å¼çå¼: %g\n",compvalue(postexp));
}
}
温馨提示:答案为网友推荐,仅供参考