1.题目:
a."(())abc{[(])}";
b."(()))abc{[]}";
c."(()()abc{[]}";
d."(())abc{[]()}";
2.整体思路
以第一个为例:
3.程序代码
//Stack.h
#ifndef __STACK_H__
#define __STACK_H__
#include <stdio.h>
#include <Windows.h>
#include <assert.h>
#define MAXSIZE 10
//typedef int DataType;
typedef struct StackNode
{
DataType arr[MAXSIZE];
int top;
}Stack, *pStack;
void InitStack(pStack ps);
void PushStack(pStack ps, DataType data);
void PopStack(pStack ps);
DataType TopStack(pStack ps);
int SizeStack(pStack ps);
int EmptyStack(pStack ps);
#endif // __STACK_H__
//Stack.c
#include "Stack.h"
//初始化栈
void InitStack(pStack ps)
{
assert(ps);
ps->top = 0;
}
//压栈
void PushStack(pStack ps, DataType data)
{
assert(ps);
ps->arr[ps->top++] = data;
}
//出栈
void PopStack(pStack ps)
{
assert(ps);
ps->top--;
}
//求出栈顶的元素
DataType TopStack(pStack ps)
{
assert(ps);
return ps->arr[ps->top - 1];
}
//求出栈中元素的个数
int SizeStack(pStack ps)
{
assert(ps);
return ps->top;
}
//求栈是否为空
int EmptyStack(pStack ps)
{
assert(ps);
return 0 == ps->top;
}
//test.c
#include "Stack.h"
void MatchBrackets(const char *p)
{
Stack s;
InitStack(&s);
while (*p)
{
//检测该字符是否为左括号,若果是就压栈
if (('(' == *p) || ('[' == *p) || ('{' == *p))
{
PushStack(&s, *p);
}//检测该字符是否为右括号
else if ((')' == *p) || (']' == *p) || ('}' == *p))
{
//若此时栈中为空的,说明没有左括号与之匹配,右括号多了
if (EmptyStack(&s))
{
printf("右括号比左括号多!!\n");
return;
}
//检测左右括号是否匹配,若匹配则相应的左括号出栈
if (!(('(' == TopStack(&s) && ')' == *p) ||
('[' == TopStack(&s) && ']' == *p) ||
('{' == TopStack(&s) && '}' == *p)))
{
printf("左右括号不匹配!!!\n");
return;
}
PopStack(&s);
}
p++;
}
//结束循环且没有返回,说明检测了所有的字符
//此时检测栈中是否为空,不为空说明还有多余的左括号
if (SizeStack(&s) != 0)
{
printf("左括号比右括号多!!!\n");
return;
}
printf("括号匹配正确!!!\n");
}
int main()
{
char a[] = "(())abc{[(])}";
char b[] = "(()))abc{[]}";
char c[] = "(()()abc{[]}";
char d[] = "(())abc{[]()}";
MatchBrackets(a);
MatchBrackets(b);
MatchBrackets(c);
MatchBrackets(d);
system("pause");
return 0;
}