原理很简单,当操作者输入中每遇数字便将数字压入数栈,每遇符号便进行两次弹栈进行该符号的运算,运算结果再次压入数栈。唯一要注意的一点就是进行除法运算时需要判断除数是否为0。
头文件:
/*CaptainUniverse_ 2022.3.31*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
/*CaptainUniverse_ 2022.3.31*/
子函数:
/*CaptainUniverse_ 2022.3.31*/
void InitStack(sqStack *);//初始化
void Push(sqStack *,ElemType);//入栈
void Pop(sqStack *,ElemType);//出栈
int StackLen(sqStack);//栈元素个数
/*CaptainUniverse_ 2022.3.31*/
主函数:
/*CaptainUniverse_ 2022.3.31*/
int main()
{
sqStack s;
char c;
double d,e;
InitStack(&s);
char str[MAXBUFFER];
int i=0;
printf("请按照后缀表达式(逆波兰表达式)输入待计算表达式,数据与运算符之间用空格隔开,以#结束!\n");
scanf("%c",&c);
while('#'!=c)
{
while(isdigit(c)||'.'==c)
{
str[i++]=c;
str[i]='\0';
if(i>=10)
{
printf("出错:输入的单个数据过大!\n");
return -1;
}
scanf("%c",&c);
if(' '==c)
{
d=atof(str);
Push(&s,d);
i=0;
break;
}
}
switch(c)
{
case '+':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d+e);
break;
case '-':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d-e);
break;
case '*':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d*e);
break;
case '/':
Pop(&s,&e);
Pop(&s,&d);
if(!e)
{
printf("除数不可为0!\n");
return -1;
}
Push(&s,d/e);
break;
}
scanf("%c",&c);
}
Pop(&s,&d);
printf("最终结果为:%lf\n",d);
return 0;
}
/*CaptainUniverse_ 2022.3.31*/