zoukankan      html  css  js  c++  java
  • 一本通1354 括弧匹配检验

    【题目描述】

    假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。

    现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?

    输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出:OK。

    【输入】

    输入仅一行字符(字符个数小于255)。

    【输出】

    匹配就输出 “OK” ,不匹配就输出“Wrong”。

    【输入样例】

    [(])

    【输出样例】

    Wrong


    代码:


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    char a[256],b[256];//一个输入的数组,一个栈
    int main()
    {
    gets(a);
    int t=0;
    for(int i=0;i<strlen(a);i++)
    {
    if(a[i]=='(')//如果输入的是左括号,那么栈里面存一个并且+1。这里有一个非常细节的地方!那就是++t而不是t++。因为到最后栈清空,指针应该是0。如果0上面有东西,那肯定是不行的,所以从1开始存。

    b[++t]='(';
    if(a[i]=='[')
    b[++t]='[';
    if(a[i]==')')//如果是右括号,那么就找指针指的地方可不可以匹配
    {
    if(b[t]=='(')
    t--;//如果可以匹配,那么指针--,准备判断下一个
    else
    t++;//如果不行,那么就相当于导入右括号,因为右括号是不能跟后面的匹配的,所以空的也无所谓
    }
    if(a[i]==']')//同理
    {
    if(b[t]=='[')
    t--;
    else
    t++;
    }
    }
    if(t==0)//如果清空,那么可以;反之不行
    {
    cout<<"OK";
    return 0;
    }
    else
    {
    cout<<"Wrong";
    return 0;
    }
    return 0;
    }

    思路很重要啊,应用了栈。一开始我的思路其实是分开来做,但是我没有想到存数组指针--的方法。怎么说呢,虽然这节是栈,但其实我在做第一个括号匹配的时候,也就是只有一种括号的时候,我没有用栈,只是用了一个变量,有左括号就+1,右括号就-1,只需判断过程中有没有下溢并且结果是不是0就行。但是多种括号就行不通了,因为涉及到一个括号夹着括号的问题。所以指针--的方法是很巧妙的(其实就是栈)。理解不了思路可以这样想:如果可以,总有一组是“面对面的”,也就是一组对应括号中没有别的括号,那么这一组“抵消”掉之后再往前找,然后可以的话再抵消。比如:( [ ( ) ] ),当循环到第四个,也就是第一个右括号的时候,可以和左括号组成一组,然后指针--,就变成了( [ ] ),然后再抵消,最后就可以判断了

  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/57xmz/p/12629837.html
Copyright © 2011-2022 走看看