题目描述:
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
输入:
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
输出:
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
样例输入:
)(rttyy())sss)(
样例输出:
)(rttyy())sss)(
? ?$
#include<stdio.h>
#include<string.h>
int main(){
char s[101];
while(scanf("%s",s)!=EOF){
int i,j,len=strlen(s),cnt=-1;
char ss[101];
char sta[101];
strcpy(ss,s); //保留s输出原串
for(i=0;i<len;i++){
if(s[i]=='('){ //左括号入栈(存取左括号下标)
sta[++cnt]=i;
continue;
}
if(s[i]==')'){
if(cnt>=0){
cnt--; //右括号出栈
}else{
s[i]='?'; //空栈则置改右括号为?表示不匹配
}
continue;
}
s[i]=' ';
}
s[i]='\0';
for(i=0;i<=cnt;i++){ //栈不为空,则将左括号置为$
s[sta[i]]='$';
}
printf("%s\n",ss);
printf("%s\n",s);
}
return 0;
}
tips:
1.遇到左括号入栈
2.遇到右括号,看栈是否为空:空栈则便是该右括号不匹配置为?;栈不空则出栈左括号表示匹配
3.最后看栈是否为空,栈空则便是所有左括号匹配完成,否则出栈左括号置为$