【题目链接】1203:扩号匹配问题
【题解思路】
用STL的栈(stack)进行求解。
1. 定义一个字符串a复制输入的字符串s,我们可以保留原字符串s并在a中进行修改。
2. 建一个int类型的栈,存左括号的下标。
2. 扫描整个字符串,如果是‘( ’ ,直接将此时下标压入栈中。
3. 如果是‘ )’,需要判断栈是否空。如果栈非空,说明还有未匹配的左括号,栈顶与之最近,和它匹配并出栈;如果栈空,匹配失败,将字符变成‘ ?’。
4. 扫描结束时,栈内的所有左括号都是无法匹配的左括号,全部变‘ $ ’。
5. 最后先输出原字符串s,后输出字符串a,a中如果不是‘ $ ’或‘?’,输出空格就好。
【题解代码】
#include<iostream>
#include<stack> //栈的头文件
using namespace std;
int main()
{
string s;
while(cin>>s) //Ctrl+Z结束输入
{
stack<int> st;
string a=s;
for(int i=0;s[i];i++)
{
if(s[i]=='(') st.push(i);
if(s[i]==')')
{
if(st.size()>0) st.pop();
else a[i]='?';
}
}
while(st.size()>0)
{
a[st.top()]='$';
st.pop();
}
cout<<s<<endl;
for(int i=0;a[i];i++)
{
if(a[i]!='$'&&a[i]!='?') cout<<' ';
else cout<<a[i];
}
cout<<endl;
}
}