首页 > 其他分享 >UVA 673 Paretheses Balance

UVA 673 Paretheses Balance

时间:2022-12-21 14:34:00浏览次数:57  
标签:Paretheses val err top 合法 括号 mp UVA Balance

原题Vjudge

题目大意

怼给你一堆括号,判断是否合法
有三条规则
(1)空串合法
(2)如果\(A和B\)都合法,则\(AB\)合法(例如:\(()和[]\)都合法,则\(()[]\)合法)
(3)如果\(A\)合法,则\((A)和[A]\)都合法(例如\(A = ([])\),则\((([]))和[([])]\)都是合法的)

解题思路

可以成对的括号是贴在一起的(在上述规则的定义下)
通过栈的“后入先出”性质我们可以想到
遇到左括号就入栈,遇到右括号就判断是否与栈顶的左括号匹配,若匹配则出栈,不匹配则说明括号序列不合法,输出\(No\)即可
到最后别忘记检测括号是否全部匹配(即是否栈空)

坑点

注意规则(1)空串合法,所以可能毒瘤UVA会给个空行,所以用\(getline\)进行读入
注意&&是短路运算符,在元素出栈前应该判断是否栈空,设是否栈空为条件\(p\),括号与栈顶是否匹配为条件\(q\),则我们的\(if\)语句应该是\(p\wedge q\),此时当\(p\)不成立,即栈空时,会直接短路掉,而不会取到栈顶引发段错误.(不过手写栈可以设置空栈条件是top = 0,这样就不用考虑短路)

代码实现

#include <iostream>

using namespace std;
const int N = 1e7 + 86;
int top;
char mp[358], s[N];

int main()
{
    int T;
    scanf("%d", &T);
    getchar();
    mp['('] = ')', mp['['] = ']';
    
    while (T -- ) 
    {
        string val;
        getline(cin, val);
        
        if (!val.size()) { puts("Yes"); continue ; }
        bool err = 0;
        
        for (auto c : val) 
        {
            if (err) break ;
            if (c == '(' || c == '[') s[ ++ top] = c;
            else if (top && c == mp[s[top]]) -- top;
            else err = 1;
        }
        if (top) err = 1, top = 0;
        
        puts(err ? "No" : "Yes");
    }
    
    return 0;
}

Accepted!

标签:Paretheses,val,err,top,合法,括号,mp,UVA,Balance
From: https://www.cnblogs.com/StkOvflow/p/16996202.html

相关文章

  • UVA 11988 Broken Keyboard
    原题Vjudge题目大意给定一个字符串,字符串中可能含有\([\)字符或者\(]\)字符被\([]\)框起来的字符串将会被移到最开头,(如果之前有过\([]\),则越晚出现的\([]\)内字符串会被......
  • UVA 442 Matrix Chain Multiplication
    原题Vjudge题目大意模拟矩阵链乘的计算,如果出现错误就输出error,否则输出总共的乘法次数对于一个矩阵\(A(m\timesn),B(n\timesp)\)乘法次数为\(m\timesn\timesp......
  • UVA 514-Rails
    原题Vjudge题目大意给定一个入栈序列\([1,2,3....,n]\),判断出栈序列\([a_{1},a_{2}.....a_{n}]\)是否合法解题思路这道题目我们可以用一个栈与双指针结合的算法我们设......
  • UVA1615 高速公路 Highway
    #include<iostream>#include<cmath>#include<algorithm>#include<cstdio>usingnamespacestd;typedeflonglongll;typedefdoubledb;constdbeps=1e-4......
  • UVA1398 Meteor
    每颗流星经过框的时间用一个左开右开的开区间来表示,然后就是简单的求最大区间覆盖问题了。其中求开区间的方法很巧妙,可以节省一些代码量。#include<iostream>#include......
  • UVA1343 旋转游戏 The Rotation Game
    #include<iostream>#include<string>#include<algorithm>#include<cstring>usingnamespacestd;constintread[25][2]={ {0,0}, {1,3},......
  • 程序设计基础实验课 单元六的题-UVA10410 TreeReconstruction 树重建
    入门指南题面:  洛谷题面:   观看的题解:https://www.cnblogs.com/jerryRey/p/4622927.html  对样例区样例画的一些图:       题目的一些争议......
  • UVALive 2038 Strategic game--树形dp
    原题链接:​​http://vjudge.net/problem/UVALive-2038​​题意:一棵树,n个点,0为根,求最少的点可以覆盖所有边。分析:dp[u][0]表示u点不选;dp[u][1]表示该点选择。#defin......
  • UVALive 4015 Caves--树形dp
    原题链接:​​http://vjudge.net/problem/UVALive-4015​​题意:n个部落,编号0到n-1,n-1条路连接n个部落,连成一棵树,机器人从树根出发,问在最多走x米最多经过多少部落。分析:dp[i......
  • UVA 10859 Placing Lampposts--树形dp
    原题链接:​​http://vjudge.net/problem/UVA-10859​​题意:给一个N个点M条边的无向无环图,就是树的意思,每个节点都可以放灯。每盏灯将照亮以它为一个端点的所有边,在所有边都......