1487 - 括号匹配问题
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注。
Input
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
Output
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"","?"和空格组成,""和"?"表示与之对应的左括号和右括号不能匹配。
Examples
Input
bge))))))))) ((IIII)))))) ()()()()(uuu ))))UUUU((()
Output
bge)))))))))
?????????
((IIII))))))
????
()()()()(uuu
$
))))UUUU((()
???? $$
Hint
算法思想:括号匹配是典型的栈的应用,因此可以采用链栈,思路如下:(1)第一次遍历输入字符串,1.是左括号,则入栈,同时标记数组的相应位置置空格2.是右括号,则检测栈是否为空,不为空,则判断有对应的左括号,同时出栈;为空,则没有对应的左括号,标记数组置‘?’(2)第二次遍历输入字符串,1.是右括号,则入栈。2.是左括号,则检测栈是否为空,不为空,则判断有对应的右括号,同时出栈;为空,则没有对应的左括号,标记数组置‘$’。
Solution C
#include <stdio.h> #include <stdlib.h> #include <string.h> struct bracket { char data[101]; int top; }; void main() { char str[101],flag[101]; int i,len; struct bracket *p, *q; while(scanf("%s",str) != EOF) { p=(struct bracket *)malloc(sizeof(struct bracket)); q=(struct bracket *)malloc(sizeof(struct bracket)); p->top = q->top = 0; len = strlen(str); for(i=0;i<len;i++) { switch(str[i]) { case '(' : p->data[p->top++] = str[i]; flag[i]=' '; break; case ')' : if(p->top>0) { flag[i]=' '; p->top-=1; }else { flag[i]='?'; } break; default : flag[i]=' '; break; } } for(i=len-1;i>=0;i--) { switch(str[i]) { case ')' : q->data[q->top++] =str[i]; break; case '(' : if(q->top>0) { q->top-=1; }else { flag[i]='$'; } break; default : break; } } for(i=0;i<len;i++) printf("%c",str[i]); printf("\n"); for(i=0;i<len;i++) printf("%c",flag[i]); printf("\n"); } }
Solution C++
#include <stdio.h> #include <string.h> char s[111]; void run() { int k=0,i,n; char o[111]; printf("%s\n",s); n=strlen(s)-1; strcpy(o,""); for(i=0;i<=n;i++) strcat(o," "); k=0; for(i=0;i<=n;i++) { if(s[i]=='(') k++; if(s[i]==')') { if(k>0) k--; else o[i]='?'; } } k=0; for(i=n;i>=0;i--) { if(s[i]==')') k++; if(s[i]=='(') { if(k>0) k--; else o[i]='$'; } } printf("%s\n",o); } int main() { gets(s); while(strlen(s)!=0) { run(); strcpy(s,""); gets(s); } return 0; }
Hint
算法思想:
括号匹配是典型的栈的应用,因此可以采用链栈,思路如下:
(1)第一次遍历输入字符串,
1.是左括号,则入栈,同时标记数组的相应位置置空格
2.是右括号,则检测栈是否为空,不为空,则判断有对应的左括号,同时出栈;为空,则没有对应的左括号,标记数组置‘?’
(2)第二次遍历输入字符串,
1.是右括号,则入栈。
2.是左括号,则检测栈是否为空,不为空,则判断有对应的右括号,同时出栈;为空,则没有对应的左括号,标记数组置‘$’。