结构推理 实现简单算术表达式的求值问题,能够进行加、减、乘、除和乘方运算。使用时算式采用后缀输入法,例如,若要计算“3+5”则输入3 5+;乘方运算符用“^”表示;每次运算在上一次运算结果的基础上进行。
   算法分析:表达式求值是程序设计语言编译中的一个最基本的问题。它的实现方法是栈的一个典型的应用实例。在计算机中,任何一个表达式都是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。其中操作数可以是常数,也可以是变量或常量的标识符;运算符可以是算术运算符、关系运算符和逻辑运算符;界限符为左右括号和标识表达式结束的结束符。
【正确答案】算法的主要思路是:每当遇到操作数时,便入栈;遇到操作符时,便连续弹出两个操作数并执行运算,然后将运算结果压入栈顶。输入“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>
【答案解析】