【正确答案】算法的主要思路是:每当遇到操作数时,便入栈;遇到操作符时,便连续弹出两个操作数并执行运算,然后将运算结果压入栈顶。输入“c”时,清空操作数栈;输入“1”时,显示当前栈顶值;输入“q”时,结束程序。下面只介绍了顺序栈实现的算法,还可以采用链栈实现。这种方法作为实验内容,请读者自己设计。将顺序栈的定义及其基本操作的实现写在头文件“seqstack.h”中,同时修改宏定义为#define datatype float。具体算法实现如下:
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#include"string.h"
#include"seqstack.h"
main()
{ SEQSTACK stack,*s;
float resu,a,b;
char c[20];
s=&stack:
Init_Stack(s);/*创建一个空栈*/
printf("A simple expressin caculation\n");
do{
printf(":");
gets(c);
switch(*c)
{ case'+': a=pop_Stack(s);
b=pop_Stack(s);
printf("/%f\n",a+b);
Push_Stack(s,a+b);
break;
case '-': if(strlen(c)>1)/*遇'-'需判断是减号还是负号*/
Push_Stack(s,atof(c));
else
{ a=Pop_Stack(s);
b=Pop_Stack(s);
printf("/%f\n",b-a);
Push_Stack(s,b-a);)
break;
case '*': a=Pop_Stack(s);
b=Pop_Stack(s);
printf("/%f\n",a*b);
Push_Stack(s,a*b);
break;
case '/': a=Pop_Stack(s);
b=Pop_Stack(s);
if(a==0)
(printf("Devide by 0!\n"); /*检查除数是否为0*/
Clear_Stack(s);)
else
{printf("/%f\n",b/a);
Push_Stack(s,b/a);)
break;
case '^': a=Pop_Stack(s);
b=Pop_Stack(s);
printf("/%f\n",pow(b,a));
Push_Stack(s,pow(b,a));
break;
case 'c': Clear_Stack(s);
break;
case '1': a=Gettop_Stack(s);
printf("Current value on top 0f stack is:/%f\n",a);
break;
default:Push_Stack(s,atof(c));/*读入的是操作数,转换为浮点型后压入栈*/
break;
}
}while(*c!='q');
free(s);
}
程序运行实例如下:
A simple expressin caculation
:10<cr>
:20<cr>
:+<cr>
30.000000
:15<cr>
:/<cr>
2.000000
:1<cr>
Current value on top of stack is:2.000000
:c<cr>
:16<cr>
:2<cr>
:^<cr>
256.000000
:q<cr>
【答案解析】