题库 题库

【简答题】

试题四(共15分)
    阅读以下说明和C函数,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明]
    计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 5 120 37 - * +”。
    计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中,重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46 5 120 37 - * +”的计算过程为:
    a. 依次将46、5、120、37压入栈中;
    b. 遇到“-”,取出37、120,计算120–37,得83,将其压入栈中;
    c. 遇到“*”,取出83、5,计算5*83,得415,将其压入栈中;
    d. 遇到“+”,取出415、46,计算46+415,得461,将其压入栈中;
    e. 表达式结束,则计算过程完成。
    函数computing(char expr[],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;      /*字符指针指向后缀表达式串的第一个字符*/
  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;
    }
}

参考答案

   

相关试题