题目:点此

描述:

在某个字符串(长度不超过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 }
View Code

 

posted on 2020-02-07 10:34  eason66  阅读(320)  评论(0编辑  收藏  举报