#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ERROR 0
#define OK 1
#define N 100
//数字栈
typedef struct
{
float *elem;
int top;
}number;
typedef struct
{
char *elem;
int top;
}character;
//初始化数字栈
int InitNumStack(number *S)
{
S->elem=(float *)malloc(sizeof(float)*N);
if(!(S->elem))
return ERROR;
S->top=-1;
return OK;
}
int InitChStack(character *S)
{
S->elem=(char *)malloc(sizeof(char)*N);
if(!(S->elem))
return ERROR;
S->top=-1;
return OK;
}
//数字栈入栈
int PushNum(number *S,float e)
{
S->top++;
S->elem[S->top]=e;
return OK;
}
//字符栈入栈
int PushCh(character *S,char e)
{
S->top++;
S->elem[S->top]=e;
return OK;
}
//数字栈出栈
int PopNum(number *S,float *e)
{
if (S->top==-1)
{
printf("数字栈空!\n");
return ERROR;
}
*e=S->elem[S->top];
S->top--;
return OK;
}
//字符栈出栈
int PopCh(character *S,char *e)
{
if (S->top==-1)
{
printf("字符栈空!\n");
return ERROR;
}
*e=S->elem[S->top];
S->top--;
return OK;
}
//数字栈取栈顶元素
float GetNumTop(number *S)
{
if(S->top==-1)
{
printf("数字栈为空!\n");
return ERROR;
}
return S->elem[S->top];
}
//字符栈取栈顶元素
int GetChTop(character *S)
{
if (S->top==-1)
{
printf("字符栈空!\n");
return ERROR;
}
return S->elem[S->top];
}
//判断输入字符的合法性以及类型
int judgeaAType(char a)
{
if(a=='+'||a=='-'||a=='*'||a=='/'||a=='%'||a=='^'||a=='('||a==')'||a=='#')
return 2;
else if(a>'0'&&a<'9')
return 1;
else
return ERROR;
}
//判断字符优先级
char Compera(char ch1,char ch2)
{
if(ch1=='+'||ch1=='-')
{
if(ch2=='+'||ch2=='-'||ch2==')'||ch2=='#')
return '>';
else if(ch2=='*'||ch2=='/'||ch2=='^'||ch2=='(')
return '<';
}
else if(ch1=='*'||ch1=='/')
{
if(ch2=='*'||ch2=='/'||ch2=='+'||ch2=='-'||ch2==')'||ch2=='#')
return '>';
else if(ch2=='('||ch2=='^')
return '<';
}
else if(ch1=='^')
{
if(ch2=='*'||ch2=='/'||ch2=='+'||ch2=='-'||ch2==')'||ch2=='#')
return '>';
else if(ch2=='(')
return '<';
else
return '!';
}
else if(ch1=='(')
{
if(ch2=='+'||ch2=='-'||ch2=='*'||ch2=='/'||ch2=='^'||ch2=='(')
return '<';
else if(ch2==')')
return '=';
}
else if(ch1==')')
{
if(ch2=='+'||ch2=='-'||ch2=='*'||ch2=='/'||ch2=='^'||ch2=='#')
return '>';
else if(ch2=='(')
return '=';
else
return '!';
}
else if(ch1=='#')
{
if(ch2=='+'||ch2=='-'||ch2=='*'||ch2=='/'||ch2=='^')
return '<';
else if(ch2=='#')
return '=';
else
return '!';
}
return '!';
}
//出栈字符与数字的计算
float Operation(float a,char ch,float b)
{
float result;
switch(ch)
{
case '+':
result=a+b;
break;
case '-':
result=a-b;
break;
case '*':
result=a*b;
break;
case '/':
result=a/b;
break;
case '^':
result=pow(a,b);
break;
}
return result;
}
int main()
{
float a,b,sum,result;
int i=0,sum1;
char ch1,ch2;
char A[N];
character ch;
number num;
InitChStack(&ch);
InitNumStack(&num);
PushCh(&ch,'#');
printf("请输入表达式(以#结束):\n");
gets(A);
ch1=A[0];
while(ch1!='#'||GetChTop(&ch)!='#')
{
if(judgeaAType(ch1)==1)
{
sum1=ch1-'0';
i++;
ch1=A[i];
while(judgeaAType(ch1)==1)
{
sum1=sum1*10+ch1-'0';
i++;
ch1=A[i];
}
sum=(float)(sum1);
PushNum(&num,sum);
}
else if(judgeaAType(ch1)==2)
{
switch(Compera(GetChTop(&ch),ch1))
{
case '<':
PushCh(&ch,ch1);
i++;
ch1=A[i];
break;
case '=':
PopCh(&ch,&ch2);
i++;
ch1=A[i];
break;
case '>':
PopCh(&ch,&ch2);
PopNum(&num,&b);
PopNum(&num,&a);
result=Operation(a,ch2,b);
PushNum(&num,result);
break;
case '!':
printf("输入有误!\n");
exit(0);
break;
}
}
else
{
printf("输入有误!\n");
exit(0);
}
}
PopNum(&num,&result);
printf("%.2f\n",result);
return 0;
}
5:表达式求值
最新推荐文章于 2024-06-27 15:25:28 发布