StkOvflow

STACK OVERFLOW!

一言(ヒトコト)

这年头 expert 很难么?
——zn

UVA 673 Paretheses Balance

原题Vjudge

题目大意

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

解题思路

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

坑点

注意规则(1)空串合法,所以可能毒瘤UVA会给个空行,所以用getline进行读入
注意&&是短路运算符,在元素出栈前应该判断是否栈空,设是否栈空为条件p,括号与栈顶是否匹配为条件q,则我们的if语句应该是pq,此时当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!

posted @   StkOvflow  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示