题目:点此
描述:
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
思路:
定义一个数组存要输出的字符($,?, (空格))
按常规的括号匹配问题去做(遇到左括号入栈,遇到右括号出栈),只是遇到右括号不匹配时数组对应位置赋为?,左括号不匹配时对应位置赋为$,匹配的对应位置赋为空格。最后输出原字符串后输出此字符数组即可。
犯的错误:
EOF(-1)仅限用于scanf字符数组,不能用于字符串,否则
收获:
EOF(-1)不能用于字符串,读入字符串可以这样:
while(getline(cin,c))//string c
代码:
1 #include <stack> 2 #include <iostream> 3 using namespace std; 4 char a[101]; 5 stack <int> b; 6 string c; 7 int main(){ 8 while(getline(cin,c)){ 9 for(int i=0;i<c.length();i++){ 10 a[i]=' '; 11 if(c[i]=='('){ 12 b.push(i); 13 } 14 if(c[i]==')'){ 15 if(b.empty()){ 16 a[i]='?'; 17 } 18 else{ 19 b.pop(); 20 } 21 } 22 } 23 while(!b.empty()){ 24 int i=b.top(); 25 b.pop(); 26 a[i]='$'; 27 } 28 a[c.length()]='\0'; 29 cout << c << "\n" << a << "\n"; 30 } 31 return 0; 32 }