括号匹配(栈)


在编程当中我们只会用到三种括号:圆括号(),方括号[]和花括号{},编译器在编译的时候会检查括号是否正确匹配。例如{[()]}、{()[]{}}都是合法的匹配。但是([)]则是不合法的匹配。请编写一个程序来判断输入的括号序列是否合法。

根据思路:

 

#include <stdio.h>
#include <string.h>

int main()
{
int i, j, z, flag;
char a[101], s[101];
memset(s, '.', sizeof(s));
gets(a);
i = strlen(a);
j = 0;
z = 0;
flag = 0;

while(j < i)
{
if(a[j] == '(' || a[j] == '[' || a[j] == '{' || a[j] == ')' || a[j] == ']' || a[j] == '}') //是括号
{
if(a[j] == '(' || a[j] == '[' || a[j] == '{') //该字符是左括号
{
s[++z] = a[j]; //入栈
j++;
}
else //不是左括号
{
if(s[z] == '.')//栈为空,右括号比左括号多
{
//printf("右括号比左括号多\n");
flag = 1;
break;
}
else//栈不为空,检测该括号是否与栈顶括号匹配
{
if((s[z] == '(' && a[j] == ')') || (s[z] == '[' && a[j] == ']') || (s[z] == '{' && a[j] == '}')) //匹配,栈顶元素出栈
{
s[z] = '.';
if(z > 1)
z--;
j++;
}
else //不匹配
{
//printf("括号匹配出错, 退出\n");
flag = 1;
break;
}
}
}
}
else //不是括号
{
j++;
continue;
}

}
if(s[z] != '.' || flag == 1)
printf("NO\n");
else
printf("YES\n");

return 0;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM