题目描述:
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;
规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。
写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。
不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注.
输入:
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
输出:
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由$,?和空格组成,$和?表示与之对应的左括号和右括号不能匹配。
样例输入:
)(rttyy())sss)(
样例输出:
)(rttyy())sss)(
? ? $
# include<iostream>
# include<string>
# include<vector>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<map>
# include<stack>
using namespace std;
void clearStack(stack<char>& s) {
while(!s.empty()) {
s.pop();
}
}
void print(stack<char> s) {
while(!s.empty()) {
char t = s.top();
cout << t << " ";
s.pop();
}
}
int main() {
/*
括号匹配 思想:
str存放: )(rttyy())sss)(
res存放结果
遍历str
如果str是非(),res += ''
如果str是(,入栈
如果str是),
栈空:说明匹配不上 res+='?';
栈不空:里面全是'(', 说明匹配上了 s.pop; res+=' ';
这个题目有点问题:他不会找到完全不匹配的内容
如果: fdafda((((()
他会 $
而不是 ???? $
*/
stack<char> s;
string str;
string res;
while(cin >> str) {
// 清空栈
clearStack(s);
res = "";
for (int i = 0; i <= str.size() - 1 ; i++) {
if (str[i] != '(' && str[i] != ')') {
res += ' ';
} else if (str[i] == '(') {
s.push(str[i]);
res += ' ';
} else if (str[i] = ')') {
if (s.empty()) {
res += '?';
} else {
res += ' ';
s.pop();
}
}
}
if (!s.empty()) {
res += '$';
}
cout << res << endl;
}
}
来源:CSDN
作者:bijingrui
链接:https://blog.csdn.net/bijingrui/article/details/104009242