平衡括号问题

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

题意:

     多组案例,输入由'('、')'、'['和']'组成的括号序列,判断是否合法(构成平衡)。合法条件如下:

         1)空字符串合法。

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

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

       案例:

 

              Sample Input 

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

 

             Sample Output 

        Yes
        No
        Yes

 

分析:

      括号的三种非平衡状态:1. [(]);   2. ([());   3.(()]);

      设计思想:单个括号为非平衡状态,非单括号进行以下步骤:'0’入栈,1)凡出现左括号,则进栈;2)凡出现右括号,首先检查桟顶元素是否匹配,若匹配则栈顶元素出桟,否则'1'入栈,结束判断;3)表达式检验结束时,若桟顶元素为'0',则匹配正确即括号平衡,否则匹配失败即括号不平衡。

源代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<stack>//桟的头文件声明
 4 using namespace std;
 5 const int maxn=130;
 6 char str[maxn];
 7 stack<char> s;//建立一个桟s
 8 int main()
 9 {
10     int n,len;
11     scanf("%d",&n);//案例数
12     getchar();
13     while(n--)
14     {  
15         gets(str);//输入字符串
16         len=strlen(str);//字符串长度
17         if(len==1)//单个括号不构成平衡
18           puts("No");
19         else
20         {  
21             s.push('0'); //判定平衡依据
22            for(int i=0;i<len;i++)
23            {   if(str[i]=='('||str[i]=='[')//左括号入栈
24                  s.push(str[i]);
25                else if(str[i]==')')//右括号形式1
26                {
27                    if(s.top()=='(')//平衡括号出桟
28                        s.pop();
29                    else 
30                    { 
31                        s.push('1');//不平衡结束条件
32                       break;
33                    }
34                }
35                else  if(str[i]==']')//右括号形式2
36                {
37                    if(s.top()=='[')//平衡括号出桟
38                        s.pop();
39                    else 
40                    {  
41                        s.push('1');//不平衡结束条件
42                       break;
43                    }
44                }
45            }
46            puts(s.top()=='0'?"Yes":"No");//判定平衡
47         }
48     }
49         return 0;
50 }

 

转载于:https://www.cnblogs.com/huaszjh/p/4674678.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值