SCAU程序设计在线实训平台_实验_数据结构_拓展习题2
·
18933 括号匹配问题
Description
来源于POJ3704。
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;
规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。
写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。
不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注.
输入格式
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
输出格式
对每组输出数据,输出两行。
第一行包含原始输入字符,第二行由"","?"和空格组成,"","?"和空格组成,"","?"和空格组成,"“和”?"表示与之对应的左括号和右括号不能匹配。
输入样例
((ABCD(x)
)(rttyy())sss)(
输出样例
((ABCD(x)
$$
)(rttyy())sss)(
? ?$
提示
读取多组数据时,可采用如下方法,其他scanf读到文件尾时会返回值EOF。
char s[205];
while(scanf("%s",s)!=EOF){}
代码实现
#include<iostream>
#include<stdio.h>
#include<stack>
using namespace std;
#define MAXN 102
int main() {
stack<int> S;//左括号位置栈
char str[MAXN];//原字符
while (gets(str)) {
int i;
char ans[MAXN]={0};//结果(需要清0)
for (i = 0; str[i] != 0; i++) {
if (str[i] == '(') {
S.push(i);
ans[i] = ' ';
}
else if (str[i] == ')') {
if (!S.empty()) {
S.pop();
ans[i] = ' ';//右括号匹配成功
} else {
ans[i] = '?';//右括号匹配不成功(多了)
}
}
else {//既不是左括号,也不是右括号
ans[i] = ' ';
}
}
while (!S.empty()) {
ans[S.top()] = '$';
S.pop();
}
cout << str <<endl;
cout << ans <<endl;
}
return 0;
}
更多推荐
所有评论(0)