洛谷P1241 括号序列 题解 栈

题目链接:https://www.luogu.com.cn/problem/P1241

栈解法

我们可以开一个栈,然后从左到右遍历字符串中每一个元素,如果是 ‘(’ 、 ‘[’ 就讲对应的坐标入栈,如果是 ‘)’ 且此时栈顶元素为 ‘(’ 或者是 ‘]’ 且此时栈顶元素为 ‘[’ ,则标记当前元素及栈顶元素为匹配的,同时栈顶元素出栈。

最后,遍历一下每个元素,

  • 如果该元素对应的坐标是被标记为匹配的,则输出该元素;
  • 否则,如果该元素是 ‘(’ 或 ‘)’,输出 “()” ;如果该元素是 ‘[’ 或 ‘]’ , 输出 “[]” 。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
stack<int> stk;
int n;
bool match[maxn];
char s[maxn];
int main() {
    scanf("%s", s+1);
    n = strlen(s+1);
    for (int i = 1; i <= n; i ++) {
        if (s[i] == '(' || s[i] == '[') stk.push(i);
        else if (!stk.empty()) {
            int j = stk.top();
            if (s[j] == '(' && s[i] == ')' || s[j] == '[' && s[i] == ']') {
                stk.pop();
                match[j] = match[i] = true;
            }
        }
    }
    for (int i = 1; i <= n; i ++) {
        if (!match[i]) {
            if (s[i] == '(' || s[i] == ')') cout << "()";
            else cout << "[]";
        }
        else cout << s[i];
    }
    cout << endl;
    return 0;
}
posted @ 2020-06-25 09:49  quanjun  阅读(379)  评论(0编辑  收藏  举报