括号匹配问题
char a[] = "(())abc{[(])}"; 左右括号次序匹配不正确
char a[] = "(()))abc{[]}"; 右括号多于左括号
char a[] = "(()()abc{[]}"; 左括号多于右括号
char a[] = "(())abc{}"; 左右括号匹配正确
题目分析
这是一道典型的用栈处理的题目,碰到左括号入栈,碰到右括号进行判断和出栈
#include "Stack.h"
#include <string.h>
#include <stdio.h>
void MatchBrackt(char* sequence, int size)
{
Stack stack;
StackInit(&stack);
char ch;
char leftBraket;
for(int i = 0; i < size; i++)
{
ch = sequence[i];
switch(ch)
{
case '(':
case '[':
case '{':
StackPush(&stack, (StackDataType)ch);
break;
case ')':
case ']':
case '}':
if(StackEmpty(&stack))
{
printf("右括号多\n");
StackDestroy(&stack);
return;
}
leftBracket = (char)StackTop(&stack);
StackPop(&stack);
if (leftBracket == '(' && ch != ')') {
printf("不匹配\n");
return;
}
if (leftBracket == '[' && ch != ']') {
printf("不匹配\n");
return;
}
if (leftBracket == '{' && ch != '}') {
printf("不匹配\n");
return;
}
default:
break;
}
}
if(!StackEmpty(&stack))
{
printf("左括号多\n");
return;
}
printf("匹配\n")
}
int main()
{
const char * seqs[] = {
"(())abc{[(])}",
"(()))abc{[]}",
"(()()abc{[]}",
"(())abc{[]()}"
};
int sz = sizeof(seqs)/sizeof(seqs[0]);
for(int i = 0; i < sz; i++)
{
MatchBrackt(seqs[i],strlen(seqs[i]));
}
return 0;
}
- 运行结果