括號匹配(棧)


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

根據思路:

 

#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