您的位置:首页 > 编程语言

Coursera pku C程序进阶 编程题#4:扩号匹配问题

2017-09-21 17:37 661 查看
题目描述

在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用”$”标注,不能匹配的右括号用”?”标注.

输入

输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100

注意:cin.getline(str,100)最多只能输入99个字符!

输出

对每组输出数据,!!!输出两行,第一行包含原始输入字符!!!,第二行由”","?"和空格组成,"”和”?”表示与之对应的左括号和右括号不能匹配。

代码的思想是这样的:

使用递归帮左括号,找到右括号,把已经配对完成的括号赋值为空格(“ ”)。然后把所有剩下的没有配对的右括号幅值“?”(没有配对的左括号在配对过程中就已经幅值“$”了)。而配对的过程主要是有循环和遍历组成的。

代码如下:

#include<iostream>
using namespace std;

char c[200];
int match(int pos);

int main(){

while (cin.getline(c, 101)){//输入多组数据的标准写法
int l = strlen(c);
for (int i = 0; i < l; i++){
cout << c[i];
if (c[i] != '('&&c[i] != ')'){
c[i] = ' ';
}
}
cout << endl;
//遍历以寻找匹配括号
for (int i = 0; i < l; i++){
if (c[i] == '('){
int pos = i;
match(pos);
}
}
//把剩下的没匹配的括号标识
for (int i = 0; i < l; i++){
if (c[i] == ')'){
c[i] = '?';
}
cout << c[i];
}
cout << endl;
}
}
int match(int pos){
int r = pos + 1;
while (1){
if (c[r] == ')'){
c[pos] = ' ';
c[r] = ' ';
return r;
}
else if (c[r] == '('){
match(r);
}
else if (c[r] == 0){
c[pos] = '$';
return r;
}
else{
r++;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: