[说明] 计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 5 120 37- * +”。 计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,

admin2012-04-11  29

问题 [说明]
   计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 5 120 37- * +”。
   计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中。重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46 5 120 37 - * +”的汁算过程如下。
   ①依次将46、5、120、37压入栈中。
   ②遇到“-”,取出37、120,计算120-37=83,将其压入栈中。
   ③遇到“*”,取出83、5,计算5×83=415,将其压入栈中。
   ④遇到“+”,取出415、46,计算46+415=461,将其压入栈中。
   ⑤表达式结束,则计算过程完成。
   函数computing(char expt[],int *result)的功能是基于栈计算后缀形式的表达式(以串形式存入字符数组expr)的值,并通过参数result返回该值。函数的返回值为-1/0,分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“\”)。
   函数computing中所用栈的基本操作的函数原型说明如下。
   void InitStack(STACK *s):初始化栈。
   void Push(STACK *s, int e):将一个整数压栈,栈中元素数目增1。
   void Pop(STACK *s):栈顶元素出栈,栈中元素数目减1。
   int Top(STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。
   int IsEmpty(STACK s):若s是空栈,则返回1;否则返回0。
   [C函数]
   int computing(char expr[], int *result)
   {
     STACK s; int tnum, a, b;  char *ptr; InitStack(&s);
     ptr=expr; pstr    /*字符指针指向后缀表达式串的第一个字符*/
       while  (*ptr!=’\0’)  {
         if(*ptr==’ ’) {  /*当前字符是空格*/
             (1)  ;     /*字符指针指向下一字符*/
           continue;
         }
         else
            if  (isdigit(*ptr))  {
   /*当前字符是数字,则将该数字开始的数字串转换为数值*/
                tnum=  (2)  ;
                while  (*ptr>=’0’  && *ptr<=’9’)  {
                  tnum=tnum *10+  (3)  ;
                  ptr++;
                }
                push(  (4)  );
           }
           else    /*当前字符是运算符或其他符号*/
               if  (*ptr==’+’||*ptr==’-’||*ptr==’*’||*ptr==’/’){
            if(!IsEmpty(S)){
              a=Top(s); Pop(&s); /*取运算符的第二个运算数*/
              if(!IsEmpty(S)){
                b=Top(s);  Pop(&s);
   /*取运算符的第一个运算数*/
              }
              else  return-1;
          }
          else return -1;
          switch (*ptr) {
          case’+’: Push(&S, b+a); break;
          case’-’: Push(&s, b-a); break;
          case’+’: Push(&s, b*a); break;
          case’/’: Push(&s, b/a); break;
        }
        else
           return -1;
        ptr++;     /*字符指针指向下一字符*/
   }/*while*/
   if (IsEmpty(s))  return -1;
   else {
         (5)  =Top(s); Pop(&s);   /*取运算结果*/
       if (!IsEmpty(s))  return -1;
       return 0;
      }
   }

选项

答案ptr++,或++ptr,或ptr=ptr+1,或其等价表示 0,或tnum=0 *ptr-48,或*ptr-‘0’,或其等价表示 &s,tnum *result

解析 由于后缀表达式以字符串方式存储且以空格分隔符号(数值、运算符),因此遇到空格字符时,指向表达式中字符的指针ptr应增加1指向后续字符,所以(1)处应填入“ptr++”或其等价形式。tnum的初始值应为0,因此,空(2)处应填入“0”,空(3)所在表达式将数字字符转换为数值,即空(3)处填入“*ptr-48”。空(4)处用于将转换所得的数值tnum压入栈项,根据题目中Push的原型“void Push(STACK*s, int e)”,调用时第一个实际参数是STACK类型变量的地址,第二个实际参数是一个整数,因此,空(4)处填入“&s, tnum”。由于函数computing(char expr[], int *result)通过参数result返回该表达式的值,因此需要将存在栈顶的运算结果赋值给result指向的整型变量,即空(5)处填入“*result”。
转载请注明原文地址:https://jikaoti.com/ti/SvL7FFFM
0

最新回复(0)