在編程當中我們只會用到三種括號:圓括號(),方括號[]和花括號{},編譯器在編譯的時候會檢查括號是否正確匹配。例如{[()]}、{()[]{}}都是合法的匹配。但是([)]則是不合法的匹配。請編寫一個程序來判斷輸入的括號序列是否合法。
根據思路:
#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;
}