• 平衡的括号(栈)


    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/A

    题意:输入一个包含“()”和“[]”的括号序列,判断是否合法。具体规则如下:

             1)空串合法。

             2)如果A和B都合法,则AB合法。

             3)如果A合法则(A)和[A]都合法。

             案例:

             input

                 3

                 ([])

                 (([()])))

                 ([()[]()])()

             output

                 Yes

                 No

                 Yes

    思路分析:

             1)如果长度为0,即为空串,输出Yes。

             2)如果输入第一个字符为')'或']',不可能会合法,直接输出No。

             3)进行循环判断,如果为'('或'['把它存入另一个数组中,如果为')'或']'就删除前一个'('或'['(j--),但是([)]也是错误的,所以可知如果合法,则')'或']'前面一个必为'('或'[',所以在删除前要进行判断,还有()]也是错误的,所以在判断')'或']'前,要先判断j是否为0。若为0,跳出循环。

                 如果循环正常运行结束并且那另一个数组都删除完了(j==0),就输出Yes,否则输出No。

    源代码如下:

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 int main()
     6 {
     7     char s[130],x[130];
     8     int n,j,i;
     9     cin>>n;
    10     getchar();
    11     while(n--)
    12     {   
    13         j=0;
    14         gets(s);
    15         if(strlen(s)==0)          //判断是否为空串
    16         {
    17             cout<<"Yes"<<endl;
    18             continue;
    19         }
    20         if(s[0]==')'||s[0]==']')         
    21         {
    22             cout<<"No"<<endl;
    23             continue;
    24         }
    25         for(i=0;i<strlen(s);i++)
    26         {   
    27             if(s[i]=='('||s[i]=='[')
    28                 x[j++]=s[i];
    29             else
    30             {
    31             
    32                 if(j==0)       
    33                     break;
    34                 if(s[i]==')')
    35                 {
    36                     if(x[j-1]=='(')        
    37                         j--;             //删除“(”
    38                     else
    39                         break;
    40                 }
    41                 if(s[i]==']')
    42                 {
    43                     if(x[j-1]=='[')
    44                         j--;            //删除“[”
    45                     else
    46                         break;
    47                 }
    48             }
    49         }
    50             if(j==0&&i==strlen(s))
    51                 cout<<"Yes"<<endl;
    52             else
    53                 cout<<"No"<<endl;
    54     }
    55     return 0;
  • 相关阅读:
    [通信] C# TCP实现多个客户端与服务端 数据 与 文件的传输
    [压缩]C#下使用SevenZipSharp压缩解压文本
    [通信] C#多线程Socket-文件传输
    [算法] N 皇后
    【算法】N Queens Problem
    [Eclipse]
    [C/C++] String Reverse 字符串 反转
    [SQL] 获取 Microsoft SQL Server 2008 的数据表结构
    [WIFI] WIFI 破解(初级)
    Unable to extract 64-bitimage. Run Process Explorer from a writeable directory
  • 原文地址:https://www.cnblogs.com/q-c-y/p/4667587.html
Copyright © 2020-2023  润新知