18933 括号匹配问题
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
来源于POJ3704。
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;
规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。
写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。
不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注.
输入格式
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
输出格式
对每组输出数据,输出两行。
第一行包含原始输入字符,第二行由"","?"和空格组成,"","?"和空格组成,"","?"和空格组成,"“和”?"表示与之对应的左括号和右括号不能匹配。
输入样例
((ABCD(x)
)(rttyy())sss)(
输出样例
((ABCD(x)
$$
)(rttyy())sss)(
? ?$
提示
读取多组数据时,可采用如下方法,其他scanf读到文件尾时会返回值EOF。
char s[205];
while(scanf("%s",s)!=EOF){}
想不到解决办法 参考了别人的算法
🐮
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<vector>
#include<string.h>
int main(void){
//定义s输入
//ans存放
//location定位
char s[105];
char ans[105];
vector<int>location;
//EOF写法
//从1开始写
while (cin>>s) {
//输入后这里还要先输出一次!!!
cout << s<<endl;
int length = strlen(s);
for (int i = 0; i < length; i++) {
//如果是'('先将序号i进到vector
if (s[i] == '(') {
location.push_back(i);
}
//如果是')'先检测vector是否为空
else if (s[i] == ')') {
// 如果非空就pop尾部一个
if (!location.empty()) {
location.pop_back();
}
// 空就让ans[序号]为?
else {
ans[i] = '?';
}
}
}
//再判断vector是否为空
//非空就即为未匹配的'(' 设置该序号为'$'
while (!location.empty()) {
int i = location.back();
ans[i] = '$';
location.pop_back();
}
for (int i = 0; i < length; i++) {
//输出 如果不是'?'也不是'$'就输出' '
if (ans[i] == '?' || ans[i] == '$')
cout << ans[i]; else
cout << ' ';
}
//要换行
cout << endl;
//处理完后清空存储
memset(ans, 0, sizeof(ans));
memset(s, 0, sizeof(s));
location.clear();
}
return 0;
}