ybt1203 括号匹配问题
时空限制 1000ms/64MB
【题目描述】
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用”$”标注,不能匹配的右括号用”?”标注。
【输入】
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
【输出】
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由”$”,”?”和空格组成,”$”和”?”表示与之对应的左括号和右括号不能匹配。
【输入样例】
((ABCD(x)
)(rttyy())sss)(
【输出样例】
((ABCD(x)
$$
)(rttyy())sss)(
? ?$
代码
法一:STL栈
#include<iostream>
#include<string>
#include<stack>
using namespace std;
string s,ans;
int main(){
while (cin>>s){
int len=s.size();
stack<int> sk;
ans = "";
for (int i=0; i<len; i++){
if (s[i]=='('){ //左括号,入栈
sk.push(i); //把左括号位置入栈
ans+=" "; //空格填充左括号位置
}
else if (s[i]==')'){ //右括号
if (!sk.empty()) { sk.pop(); ans+=" "; } //匹配,退栈,空格填充右括号位置
else ans+="?"; //不匹配,?填充右括号位置
}
else ans+=" "; //空格填充
}
while (!sk.empty()){
ans[sk.top()]='$'; //把栈里未匹配左括号变为 $
sk.pop();
}
cout<<s<<endl<<ans<<endl;
}
return 0;
}
法二:手动栈
#include<iostream>
#include<string>
using namespace std;
string s,ans;
int stack[105];
int main(){
while (cin>>s){
int len=s.size(),top=0;
ans = "";
for (int i=0; i<len; i++){
if (s[i]=='('){ //左括号,入栈
stack[++top]=i; //把左括号位置入栈
ans+=" "; //空格填充左括号位置
}
else if (s[i]==')'){ //右括号
if (top) top--,ans+=" "; //匹配,退栈,空格填充右括号位置
else ans+='?'; //不匹配,?填充右括号位置
}
else ans+=" "; //空格填充
}
while (top) ans[stack[top--]]='$'; //把栈里未匹配左括号变为 $
cout<<s<<endl<<ans<<endl;
}
return 0;
}