阅读以下说明和C函数,填补C函数中的空缺(1)~(5),将解答写在对应栏内。 [说明] 假设一个算术表达式中可以包含以下三种括号:“(”和“)”、“[”和“]”及“{”和“}”,并且这三种括号可以按照任意的次序嵌套使用。 下面仪考虑表达式

admin2012-01-13  30

问题 阅读以下说明和C函数,填补C函数中的空缺(1)~(5),将解答写在对应栏内。
   [说明]
   假设一个算术表达式中可以包含以下三种括号:“(”和“)”、“[”和“]”及“{”和“}”,并且这三种括号可以按照任意的次序嵌套使用。
   下面仪考虑表达式中括号的匹配关系,其他问题暂时忽略。例如,表达式[a-(b-5)*c[{}]中的括号是完全匹配的,而表达式[a-(b-5]))*c中的括号不是完全匹配的,因为“(”与“]”不能匹配,而且多了一个“)”,即缺少一个与“)”相匹配的“(”。
   函数if Matched(char expr[])的功能是用栈来判断表达式中的括号是否匹配,表达式以字符串的形式存储在字符数组expr中。若表达式中的括号完全匹配,则该函数的返回值为Matched,否则返回值为Mismatched。
   该函数的处理思路如下:
   (1)设置一个初始为空的栈,从左至右扫描表达式。
   (2)若遇上左括号,则令其入栈;若遇上右括号,则需要与栈顶的左括号进行匹配。
   (3)若所遇到的右括号能与栈顶的左括号配对,则令栈顶的左括号出栈,然后继续匹配过程;否则返回Mismatched,结束判断过程。
   (4)若表达式扫描结束,同时栈变为空,则说明表达式中的括号能完全匹配,返回Matched。
   函数if Matched中用到了两种用户白定义数据类型BOOL和STACK,其中,BOOL类型的定义如下:
   typedef enum {Mismatched, Matched} BOOL;
   STACK(即栈类型)的定义省略,栈的基本操作的函数原型说明如下:
   void InitStack(STACK*S):初始化一个空栈。
   void Push(STACK*S. char e):将一个字符压栈,栈中元素数目增1。
   void Pop(STACK*S):栈顶元素出栈,栈中元素数目减1。
   char Top(STACK S):返回非空栈S的栈顶元素值,栈中元素数目不变。
   int IsEmpty(STACK S):若S是空栈,则返回1,否则返回0。
   [C函数]
   BOOL ifMatched(char expr[])
   {
   char *cptr;    /*cptr指向表达式中的字符*/
   STACK S;
   char e;
   InitStack(&S);    /*构造一个空栈*/
   for(cptr=expr; *cptr!=’\0’  (1)  ){
   if(*cptr==’(’ || *cptr==’[’ || *cptr==’(’)
     (2)  ;
   else
   if(*cptr==’)’ || *cptr==’]’ || *cptr==’)’){
   if(IsEmpty(S))
   return Mismatched;
   e=  (3)  ;/*取栈顶的左括号*/
   if (*cptr==’)’ && e!=’(’ )  return Mismatched;
   if(*cptr==’]’ &&e!=’[’)  return Mismatched;
   if  (*cptr==’)’  &&e!=’{’ )  return Mismatched;
     (4)  ;/*栈顶的左括号出栈*/
   }
   }
   if(  (5)  )return Matched;
   return Mismatched;
   }

选项

答案cptr++ 或 ++cptr 或 cptr+=1 或 cptr=cptr+1 Push(&S,*cptr) Top(S) Pop(&S) IsEmpty(S)

解析 本题考查C程序设计基本能力。
   由于已经将表达式以字符串的形式存入字符数组expr,因此指针cptr就用于指示表达式中的每个字符。显然,以下for语句用于扫描expr中的每个字符:
   for(cptr=expr; *cptr!=’\0’;  (1)  )
   因此,空(1)处应填入cptr++或其等价形式。
   空(2)处进行处理的前提是遇到了左括号,因此,根据题目中对函数if Matched的处理思路描述,这时应进行压栈操作,即应填入Push(&S,*cptr),这里要注意函数调用时实参的形式。
   由于弹栈操作不能返回栈顶元素,因此根据注释,空(3)处需要读取栈项元素,即应填入Top(S),空(4)处填入Pop(&S)。
   由于表达式扫描结束且同时栈变为空,才说明表达式中的括号能完全匹配,因此,for语句的条件表达式*cptr!=’\0’不成立时表达式结束,此时控制流可以到达空(5)所在语句,在此需要判断栈的状态来决定括号是否完全匹配,即空(5)处应填入IsEmpty(S)。
转载请注明原文地址:https://kaotiyun.com/show/86jZ777K
0

最新回复(0)