题目链接 :P1241 括号序列 - 洛谷 | 计算机科学教育新生态
题目难度 :普及
解题思路:我们可以开一个栈,然后从左到右遍历,每当遇到左括号就将左括号位置压入栈,遇到右括号就取出栈顶然后与当前遍历到的左括号进行匹配匹配成功,弹出栈并进行标记匹配成功的左右括号的位置,最后进行输出,标记过的直接输出未标记的输出匹配的两个括号。
下面是代码部分:
cpp
#include<bits/stdc++.h> // 万能头文件
using namespace std;
typedef long long ll;
const int N = 1010;
stack<int>st;
string s;
int mark[N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> s;//读入字符串
for(int i=0; i< s.length(); i++)
{
if(s[i] == '(' || s[i] == '[') st.push(i);//左括号压入栈
if(!st.empty())
{
int j = st.top();//取出栈顶
if((s[i] == ')' && s[j] == '(')|| (s[i] == ']' && s[j] == '['))//判断是否匹配匹配则进行标记
{
mark[i] = mark[j] = 1;//匹配成功标记位置
st.pop();//弹出栈继续判断
}
}
}
for(int i = 0; i<s.length(); i++)
{
if(mark[i] == 1) cout<<s[i];//标记过直接输出
else
{
if(s[i] == '(' || s[i] == ')') cout<<"()";
else cout<<"[]";
}
}
return 0;
}