平衡的括号

平衡的括号 

这道题目主要运用栈的一些知识。栈在第五章的STL里已经讲了一些,这里再复习一下。

栈的特点是“先进后出”。头文件是<stack>,声明方式:"stack<int> s"。

主要有以下几个操作:

push():把元素压入“栈顶”,又称入栈

pop():从栈顶把元素弹出,出栈

top():取栈顶元素(但不删除)

size():测栈长(个数)

empty():判断栈是否为空

这是我对栈的初步总结。

下面仔细看一下这道题:

题目大意:

输入一个包含“()”和“【】”的括号序列,判断是否合法。具体规则如下:(1)空串合法;(2)如果A和B都合法,则AB合法;(3)如果A合法则(A)和【A】都合法。

题目分析:

先要测出字符串的长度,如果串长==0,是合法的,输出Yes。再判断是否为括号符,将括号符入栈;再判断是否有匹配的括号符,判断j的值,j=0或-1,则符合平衡,输出Yes,否则输出No

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<stack>
 5 using namespace std;
 6 
 7 const int maxn = 130;
 8 char c[maxn],m[maxn];
 9 
10 int main()
11 {
12     int n,i,j;
13     scanf("%d",&n);
14     getchar();
15     while(n--)
16     {
17         gets(c);    
18         if (strlen(c) == 0)
19         {
20             printf("Yes\n");
21             continue;
22         }
23         if(c[0] == ')'||c[0] == ']')
24         {
25             printf("No\n");
26             continue;
27         }
28         for(i=0,j=0;i<=strlen(c);i++)
29         {
30             if(c[i]!='(' && c[i]!=')' && c[i]!='[' && c[i]!=']' )    //判断c是否为括号符,不是则退出此次循环
31                 continue;
32             m[j]=c[i];             //将第一个括号符压入栈底,j指向栈底
33             if(j==0)              //栈底只有一个元素,使j指向第二个元素
34             {
35                 j++;
36                 continue;
37             }
38             if( (m[j-1]=='(' && m[j]==')') || (m[j-1]=='[' && m[j]==']') )//判断是否有匹配的括号符,则j指向栈前元素,否则j 自加
39                 j--;
40             else j++;
41         }
42         if(j<=0)
43             printf("Yes\n");//j=0或-1,则符合平衡,输出Yes,否则输出No
44         else
45             printf("No\n");
46     }
47     return 0;
48 }

总结:
有关栈的知识我看了好久才看明白一些。先是做了一些例题,找了一些关于栈的内容,了解了栈的知识。

关于栈,我要学习的还有很多,继续加油吧。。。

 

转载于:https://www.cnblogs.com/ttmj865/p/4674433.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值