题目描述
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子 一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无 法匹配的左括号和右括号,输出原来的字符串,并在下一行标岀不能匹配的括号。不能匹配的 左括号用”$”标注,不能匹配的右括号用”?”标注。 输入: 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串 长度不超过100O 输出: 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由和空格组成,”$”和”?” 表示与之对应的左括号和右括号不能匹配。
样例
样例输入:
)(rttyy())sss)(
样例输出:
)(rttyy())sss)(
? ?$
算法
思路
每个右括号必定要与之前未被匹配的左括号中最靠右的一个进行匹配。
因此,可以从 左至右的顺序遍历整个字符串,遍历过程中遇到左括号,
就将其放入栈中以等待后续右 括号的匹配;遇到右括号,若此时栈非空,
则栈顶左括号必定和当前右括号匹配;相反, 若此时栈为空,则表示当前右括号不存在与之匹配的左括号,右括号匹配失败;
当字符 串全部遍历完后,
若栈非空,则表明栈中的左括号不存在与之匹配的右括号,左括号匹 配失败。
C++ 代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
//const int maxn=26;
stack<int> mystack;
int main(){
string s1;
while(cin>>s1){
string s2(s1.size(),' ');//注意此处s2的初始化
for(int i=0;i<s1.size();i++){
if(s1[i]=='('){
mystack.push(i);
}else if(s1[i]==')'){//右括号
if(!mystack.empty()){
mystack.pop();
}else{
s2[i]='?';
}
}
}
while(!mystack.empty()){//清空不匹配左括号
s2[mystack.top()]='$';
mystack.pop();
}
cout<<s1<<endl;
cout<<s2<<endl;
}
return 0;
}