当前位置 博文首页 > Zhi Zhao的博客:数据结构之栈的应用(二):逆波兰计算器
输入:用户按照逆波兰表达式的形式从键盘输入一串字符(仅包括数字和运算符),数字和运算符之间用空格隔开,以#作为输入结束标志;
输出:得到最终的计算结果。
(1)若读入的是数字,则将其压入栈中;
(2)若读入的是运算符,则从栈中弹出适当数量的数字并进行计算,然后将计算结果再压回到栈中;
(3)处理完整个后缀表达式之后,栈顶上的元素即为表达式的最终结果。
int main()
{
SeqStack *s;
char c;
double d,e;
char str[maxbuffer];
int i=0;
s=createStack(size);
printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为输入结束标志:\n");
scanf("%c",&c);
while(c!='#')
{
while(isdigit(c)||c=='.') // 用于过滤数字,并将数字压入栈中
{
str[i++]=c;
str[i]='\0';
if(i>maxbuffer)
{
printf("\n出错:单个数据太大!\n");
return -1;
}
scanf("%c",&c);
if(c==' ') // 说明单个数据输入完毕
{
e=atof(str);
push(s,e);
i=0;
break;
}
}
switch(c)
{
case '+':
pop(s,&d);
pop(s,&e);
push(s,d+e);
break;
case '-':
pop(s,&d);
pop(s,&e);
push(s,e-d);
break;
case '*':
pop(s,&d);
pop(s,&e);
push(s,e*d);
break;
case '/':
pop(s,&d);
pop(s,&e);
if(d!=0)
push(s,e/d);
else
{
printf("\n输入出错,除数为零!\n");
return -1;
}
break;
}
scanf("%c",&c);
}
pop(s,&e);
printf("\n最终的计算结果为:%f\n",e);
return 0;
}
?
?
?
?
cs