平衡的括号
平衡的括号
这道题目主要运用栈的一些知识。栈在第五章的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 }
总结:
有关栈的知识我看了好久才看明白一些。先是做了一些例题,找了一些关于栈的内容,了解了栈的知识。
关于栈,我要学习的还有很多,继续加油吧。。。