数据结构C语言利用堆栈表达式求值

来源:互联网 发布:淘宝客qq群推广违规吗 编辑:程序博客网 时间:2024/04/28 16:37
#include<stdio.h>
#define maxsize 100//定义表达式字符的最大容量
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)
{
int i;
for(i=0;i<7;i++)
if(lpri[i].ch==op)return lpri[i].pri;
}//判断左运算符
int rightpri(char op)
{
int i;
for(i=0;i<7;i++)
if(rpri[i].ch==op)return rpri[i].pri;
}//判断右运算符
int inop(char ch)
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else return 0;
}//判断该字符是否为运算符
int precede(char op1,char 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[])//将我们输入的表达式变成系统能识别的表达式
{
struct
{
char data[maxsize];
int top;
} op;//定义存放运算符的栈
int i=0;
op.top=-1;
op.top++;
op.data[op.top]='=';//将等号进栈
while(*exp!='\0')//当表达式还没有表达完
{
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]!='=')//一直执行退栈,直到遇到等号为止 
{
postexp[i++]=op.data[op.top];
op.top--;

}
postexp[i]='\0';
}

float comvalue(char *postexp)//计算后缀表达式的值 
{
struct 
{
float data[maxsize];
int top;
}st;
float d,a,b,c;
st.top=-1;
while(*postexp!='\0')
{
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)
{
c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{
printf("被除数不能为0\n");
return 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]);
}



int main()
{int i,a=1;
while(a){


char exp[maxsize];
printf("请输入表达式(按回车键结束):\n");
gets(exp);



char postexp[maxsize];
trans(exp,postexp);
printf("您输入的表达式为:%s\n",exp);
printf("后缀表达式为:%s\n",postexp);
printf("计算结果为:%g\n",comvalue(postexp));
printf("********************************************\n");



}
}
0 0
原创粉丝点击