利用栈来实现表达式的计算
主函数部分:
int main()
{
node fh;
date sj;
char ch[50],z,c[6]; //ch[50]中存放表达式形成的字符串,c[6]中存放单个数据形成的字符串。
double x,y;
int i=0,j,k,n;
sj=(date)malloc(sizeof(date));
fh=(node)malloc(sizeof(node));
ysf[0]=’#’;
ysf[1]=’[’; //
ysf[2]=’+’; //
ysf[3]=’-’; //定义符号的优先级
ysf[4]=’*’; //
ysf[5]=’/’; //
sjchushihua(sj); //初始化
chushihua(fh);
push(fh,’#’); //将‘#’号键先行写入符号栈中
printf(“请输入要计算的数学表达式(以‘#’结束输入,括号统一使用‘[ ]’):\n”);
gets(ch); //将表达式存入字符串ch中
n=check(ch); //进行差错检测
if(n==0)
{
return 0;
}
while(ch[i]!=’#’||gettop(fh)!=’#’) //当表达式元素录入结束且运算符全部运算完毕时结束循环
{
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
/* 将整数和浮点数的字符存入c[6]中,运用atof函数数据字符串转成整型或浮点型 */
if((ch[i]=='-'&&(ch[i-1]=='['||i==0))||(ch[i]>47&&ch[i]<58))
{
for(k=0;k<6;k++)
c[k]='\0';
j=0;
if((ch[i]=='-')&&((ch[i-1]=='[')||(i==0))) //当数据是负数,先行录入一个‘-’号
{
c[j]='-';
j++;
i++;
}
while((ch[i]>47&&ch[i]<58)||(ch[i]=='.')) //将连续的数据字符存入c[6]中
{
c[j]=ch[i];
i++;
j++;
}
c[j]='\0';
sjpush(sj,atof(c)); //将数据字符串转化并存入数据栈
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
else if(ch[i]==93) //当遇到‘]’时,对括号内的表达式进行运算
{
while(gettop(fh)!=91) //当符号栈的栈顶元素是‘[’时,结束运算
{
z=pop(fh);
if(z=='/'&&sjgettop(sj)==0.0) //当符号是‘/’时,检查除数是否为0,如果是,出错,结束运算
{
printf("除数为0,错误!\n");
return 0;
}
x=sjpop(sj);
y=sjpop(sj); //输出两个数据栈的元素,进行运算,将结果存入数据栈中
x=yunsuan(x,z,y);
sjpush(sj,x);
}
z=pop(fh); //消去符号栈顶的‘[’
i++;
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
else
{
switch(compare(ch[i],gettop(fh))) //比较当前运算符和符号栈顶元素运算符的优先级
{
case '>':push(fh,ch[i]); //栈顶元素符号的优先级小
i++;
break;
case '=': //栈顶元素符号的优先级大或相等
case '<':if(ch[i]!=91)
{
z=pop(fh);
if(z=='/'&&sjgettop(sj)==0) //当符号是‘/’时,检查除数是否为0,如果是,出错,结束运算
{
printf("除数为0,错误!\n");
return 0;
}
x=sjpop(sj);
y=sjpop(sj);
x=yunsuan(x,z,y); //输出两个数据栈的元素,进行运算,将结果存入数据栈中
sjpush(sj,x);
break;
}
else
{
push(fh,ch[i]);
i++;
}
}
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
}
printf("其结果为:%lf\n",sjgettop(sj)); //输出数据栈顶元素,即最终结果
return 0;
}
其结果如下;
检测错误为: