首页 > 其他分享 >洛谷题单指南-线性表-P1241 括号序列

洛谷题单指南-线性表-P1241 括号序列

时间:2024-03-12 11:55:29浏览次数:22  
标签:P1241 未配对 线性表 int 洛谷题 stk 括号 flag 配对

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

题意解读:括号配对问题,直观上是堆栈的应用。关键的匹配策略是读懂该句:考察它与它左侧离它最近未匹配的的左括号。

解题思路:

本题所需核心数据结构是堆栈,由于要实现从栈顶找到第一个未匹配的左括号,所以堆栈中只存所有左括号。

从左到右遍历字符串,如果是左括号,直接入栈,

如果是右括号,判断栈顶左括号是否与其配对,如果配对则用flag数组标记已配对过的左括号、右括号的位置,且栈顶左括号出栈,因为已经配对过,

最后遍历原始字符串,如果标记是未配对字符,输出时给与配对,否则直接输出。

100分代码:

#include <bits/stdc++.h>
using namespace std;

struct node 
{
    char c;
    int idx;
};

string s;
stack<node> stk; //堆栈存未配对的左括号
int top = 0; //栈顶位置
bool flag[105]; //括号是否已配对

int main()
{
    cin >> s;
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] == ')' || s[i] == ']') //如果是右括号
        {
            if(stk.empty()) continue; //没有找到未配对的左括号
            node n = stk.top(); //第一个未配对的左括号
            if(n.c == '(' && s[i] == ')' || n.c == '[' && s[i] == ']') 
            {
                flag[n.idx] = true; //将左括号位置标记为已配对
                flag[i] = true; //将右括号位置标记为已配对
                stk.pop(); //已配对的左括号出栈
            }
        }
        else stk.push({s[i], i}); //左括号直接入栈
    }

    for(int i = 0; i < s.size(); i++)
    {
        if(!flag[i]) //如果未配对过,输出配对的结果
        {
            if(s[i] == '(' || s[i] == ')') cout << "()";
            else if(s[i] == '[' || s[i] == ']') cout << "[]";
        }
        else cout << s[i]; //已配对过的直接输出
    }

    return 0;
}

 

标签:P1241,未配对,线性表,int,洛谷题,stk,括号,flag,配对
From: https://www.cnblogs.com/jcwy/p/18067987

相关文章

  • 洛谷题单指南-线性表-P2058 [NOIP2016 普及组] 海港
    原题链接:https://www.luogu.com.cn/problem/P2058题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。解题思路:本题需要用到两个关键的数据结构:队列、数组队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人每到一只船,需要把时间放入队列,如......
  • 洛谷题单指南-线性表-P1540 [NOIP2010 提高组] 机器翻译
    原题链接:https://www.luogu.com.cn/problem/P1540题意解读:本题模拟内存的调入调出,内存先入先出的特性就是队列。解题思路:本题需要两种数据结构:队列、数组队列用来模拟内存的操作,数组充当hash表用于判断单词在内存是否存在核心逻辑:对于每一个单词,如果内存不存在,查一次词典,再将......
  • 【算法】【线性表】【链表】合并 K 个升序链表
    1 题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1-......
  • 洛谷题单指南-线性表-P1160 队列安排
    原题链接:https://www.luogu.com.cn/problem/P1160题意解读:本题是双向链表的模拟题,要快速实现M个节点的删除,用数组模拟链表是最佳做法。解题思路:双向链表关键要实现好两个操作:voidadd(intk,intv);//在第k个节点后增加第v的号节点,即在k号同学右边插入v号同学voiddel(int......
  • 洛谷题单指南-线性表-P1996 约瑟夫问题
    原题链接:https://www.luogu.com.cn/problem/P1996题意解读:约瑟夫问题是队列的典型应用。解题思路:n个人围圈报数,可以直接基于数组实现循环队列操作,再定义额外数组记录每个人是否已经出圈即可。更直观的做法,定义队列,初始放入1~n,然后重复n次,每次从1~m报数,如果报数到m,直接出队,......
  • 洛谷题单指南-线性表-P3613 【深基15.例2】寄包柜
    原题链接:https://www.luogu.com.cn/problem/P3613题意解读:此题很容易想成用二维数组求解,但是最多有10^5*10^5个寄包柜格子,二维数据会爆空间,题目明确各自一共不超过10^7,所以需要动态数据结构vector。解题思路:vector的问题在于需要提前明确空间大小,才能进行随即访问操作,否则可......
  • 洛谷题单指南-线性表-P3156 【深基15.例1】询问学号
    原题链接:https://www.luogu.com.cn/problem/P3156解题思路:简单的数组题,唯一需要注意的是读写的数据量比较大,输入输出最好用scanf、printf100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=2e6+5;inta[N],n,m;intmain(){scanf("%d%d",&......
  • 洛谷题单指南-搜索-P1825 [USACO11OPEN] Corn Maze S
    原题链接:https://www.luogu.com.cn/problem/P1825题意解读:计算最短路,依然是BFS。解题思路:相比传统的最短路迷宫,多了个传输装置,要解决几个关键问题:1、传输装置的存储定义一个数组,vector<node>trans[30],数据的每个元素都是一个vector<node>,里面存两个节点,即一对坐标2、传输......
  • 洛谷题单指南-搜索-P1032 [NOIP2002 提高组] 字串变换
    原题链接:https://www.luogu.com.cn/problem/P1032题意解读:要计算子串变换的最少步数,典型的最短路问题,可以通过BFS求解。解题思路:思路上比较直观,从给定的字符串开始,找有多少种替换可能,依次进行替换,存入队列,继续BFS,过程中记录替换的次数但是,有一些细节还需要注意:1、有多种替换......
  • 洛谷题单指南-搜索-P1162 填涂颜色
    原题链接:https://www.luogu.com.cn/problem/P1162题意解读:要把闭合圈内的0填为2,DFS处理即可。解题思路:由于方阵内只有一个闭合圈,所以闭合圈以外的0一定和边缘相连通,只需要从边缘开始,把0的连通块全部标记为2最后再输出时,2输出0,1输出1,0输出2,即可得解。100分代码:#include<bits......