平衡的括号
这道题目主要运用栈的一些知识。栈在第五章的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 #include2 #include 3 #include 4 #include 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,否则输出No44 else45 printf("No\n");46 }47 return 0;48 }
总结:
有关栈的知识我看了好久才看明白一些。先是做了一些例题,找了一些关于栈的内容,了解了栈的知识。关于栈,我要学习的还有很多,继续加油吧。。。