【描述】
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算术式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用”$”标注,不能匹配的右括号用”?”标注。
【输入】
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
【输出】
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由”$”、“?”和空格组成,”$”和”?”表示与之对应的左括号和右括号不能匹配。
【输入示例】
((ABCD(x)
)(rttyy())sss)(
【输出示例】
((ABCD(x)
$$
)(rttyy())sss)(
? ?$
【C代码】
—————
#include<stdio.h>
#include<string.h>
#defineSTACK_SIZE 100
intmain(void) {
struct Bracket {
char ch; /* 字符 */
int index; /* 字符在字符串中的下标 */
};
struct Bracketstack[STACK_SIZE]; /*栈 */
char str[STACK_SIZE];
int i, len;
inttop; /*栈顶 */
while(scanf(“%s”, str) != EOF) {
printf(“%s\n”,str); /*输出原始输入字符串 */
len = strlen(str);
top = 0;
for(i = 0; i < len; ++i) {
if(str[i] == ‘(‘){ /*左括号直接进栈 */
stack[top].ch = str[i];
stack[top].index = i;
++top;
}
else if(str[i] == ‘)’) {
if(top == 0){ /*栈空,右括号入栈 */
stack[top].ch = str[i];
stack[top].index = i;
++top;
}
else {
if(stack[top – 1].ch =='(‘) /*若栈顶元素是左括号,则出栈 */
–top;
else{ /*右括号入栈 */
stack[top].ch = str[i];
stack[top].index = i;
++top;
}
}
}
}
/*将栈的每一个元素的index值所指向的str数组的下标对应的元素设置为$或?*/
for(i = 0; i < top; ++i) {
if(stack[i].ch == ‘(‘)
str[stack[i].index] =’$’; /*不能匹配的左括号 */
else
str[stack[i].index] =’?’; /*不能匹配的右括号 */
}
/*扫描str数组,假如不是$或?,则输出空格,否则输出对应元素的值 */
for(i = 0; i < len; ++i) {
if(str[i] != ‘$’ && str[i] != ‘?’)
printf(“”); /*输出空格 */
else
printf(“%c”, str[i]);
}
printf(“\n”);
}
return 0;
}