问题 问答题

设表达式以字符形式已存入数组E[n]中,‘#’为表达式的结束符,试写出判断表达式中括号(‘(’和‘)’)是否配对的C语言描述算法:EXYX(E);(注:算法中可调用栈操作的基本算法。)

答案

参考答案:判断表达式中括号是否匹配,可通过栈,简单说是左括号时进栈.右括号时退栈。退栈时,若栈顶元素是左括号,则新读入的右括号与栈顶左括号就可消去。如此下去,输入表达式结束时,栈为空则正确,否则括号不匹配
int EXYX(char E[],int n)
//E[]是有n字符的字符数组,存放字符串表达式,以‘#’结束。本算法判断表达式中圆括号是否匹配
{char s E30]; ∥s是一维数组,容量足够大,用作存放括号的栈
int top=0; ∥top用作栈顶指针
S Etop]=‘#’; ∥‘#’先入栈,用于和表达式结束符号‘#’匹配
int i=0; ∥字符数组E的工作指针
while(E [l]!=‘#’) ∥逐字符处理字符表达式的数组
switch(E [i])
{caSe‘(’:s[++top]=‘(’;i++;break;
case‘)’:if(s[top]==‘(’{top——;i++;break;)
else{printf(“括号不配对”);exit(0);}
case‘#’:if(s Etop]==‘#’){printf(“括号配对\n”);return(1);}
else{printf(“括号不配对\n”);return(0);)∥括号不配对
default:i++; ∥读入其他字符,不作处理
}
}
本题是用栈判断括号匹配的特例:只检查圆括号的配对。一般情况下是检查花括号(‘{’,‘}’)、方括号(‘[’,‘]’)和圆括号(‘(’,‘)’)的配对问题。编写算法中如遇左括号(‘{’,‘[’,或‘(’)就压入栈中,如遇右括号(‘)’,‘]’,或‘)’),则与栈顶元素比较,如是与其配对的括号(左花括号、左方括号或左圆括号),则弹出栈顶元素;否则,就结论括号不配对。在读入表达式结束符‘#’时,栈中若只剩‘#’,表示括号全部配对成功;否则表示括号不匹配。
另外,由于本题只是检查括号是否匹配,故对从表达式中读入的不是括号的那些字符,一律未作处理。再有,假设栈容量足够大,因此入栈时未判断溢出。

多项选择题 X型题
单项选择题