• 一本通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就行。但是多种括号就行不通了,因为涉及到一个括号夹着括号的问题。所以指针--的方法是很巧妙的(其实就是栈)。理解不了思路可以这样想:如果可以,总有一组是“面对面的”,也就是一组对应括号中没有别的括号,那么这一组“抵消”掉之后再往前找,然后可以的话再抵消。比如:( [ ( ) ] ),当循环到第四个,也就是第一个右括号的时候,可以和左括号组成一组,然后指针--,就变成了( [ ] ),然后再抵消,最后就可以判断了

  • 相关阅读:
    XML 验证器
    XML 浏览器支持
    XML 元素
    查看 XML 文件
    XML 属性
    Android入门之Activity四种启动模式
    XML 简介
    XML 语法规则
    [Android]Thread线程入门3多线程
    XML 验证
  • 原文地址:https://www.cnblogs.com/57xmz/p/12629837.html
Copyright © 2020-2023  润新知