/*
栈的应用:括号匹配
算法:
1.创建一个栈,初始化栈
2.扫描元素,如果是 ( [ { 则入栈 push; 如果扫描的是 ) ] } 则需要元素出栈比较
3.如果此时栈为空 ---> 没有左括号 ,那么多一个右括号,匹配失败
4.如果此时栈不空 ---> 则元素出栈pop,如果出现 () [] {} 则成功 <==> 扫描的元素和出栈元素不匹配则失败
5.如果扫描结束后 ,栈未空 -----> 说明多一个左括号, 直接失败结束。
*/
typedef struct SqStack
{
char data[Maxsize]; //存取括号的字符数组
int top; //头指针
}SqStack; //搞一个顺序栈
void InitStack(SqStack *S)
{
S->top = -1; //顺序栈的初始化
}
int StackEmpty(SqStack S)
{
if (S.top == -1)
return 1; //栈空
else
return 0; //栈非空
}
int Push(SqStack *S, char elem)
{
if (S->top == Maxsize - 1)
return 0; //栈满无法入栈
S->top++;
S->data[S->top] = elem;
return 1; //入栈成功
}
int Pop(SqStack S, char elem)
{
if (S->top == -1)
return 0; //栈空无法出栈
*elem = S->data[S->top];
S->top--;
return 1; //出栈成功并返回元素
}
int BracketCheck(char ch[],int length)
{
int i = 0;
char elem = 0;// 接收出栈元素
//1.创建一个顺序栈
SqStack S;
//2.初始化顺序栈
InitStack(&S);
//3.开始扫描
for (i = 0; i < length; i++)
{
if (!strcmp(ch[i], "(") || !strcmp(ch[i], "[") || !strcmp(ch[i], "{"))
Push(&S, ch[i]);
else
{
if (StackEempty(S))
return 0; //栈空说明多一个右括号
Pop(&S, &elem);
if (!strcmp(ch[i], ")") && strcmp(elem, "("))
return 0;
if (!strcmp(ch[i], "]") && strcmp(elem, "["))
return 0;
if (!strcmp(ch[i], "}") && strcmp(elem, "{"))
return 0;
}
}
//扫描结束后 发现栈非空 说明多一个左括号 ,匹配失败
return StackEmpty(S); //如果判断StackEmpty == 1说明是栈空
}
int main()
{
int test = 0 ;
char ch[Maxsize] = "[{])){]}()"; //创建一个字符数组
int length = sizeof(ch) / sizeof(ch[0]); //计算字符长度
//括号匹配算法开始
test = BracketCheck(ch, length);
if (test == 1) printf("括号匹配成功\n");
else printf("括号匹配失败\n");
return 0;
}
这像是练习题
对的数据结构,考研数据结构要考,我应该改了差不多了,但是老是 printf 匹配失败