题目要求:
给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的顺序配对,如 “{ [ ] ( ) }” 或 “[ ( { } [ ] ) ]” 等为正确的格式,而 “[ ( ] )” 或 “{ [ ( ) }” 或 “( { } ] )” 均为不正确的格式。
代码如下:
#include<stdio.h>
#include<string.h>#include<stdlib.h>
#define N 100
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct
{
ElemType data[N];
int top;
} SqStack;
//初始化栈
void Init(SqStack *s)
{
s = (SqStack *)malloc(sizeof(SqStack));
s -> top = -1;
}
//进栈
int push(SqStack *s,ElemType n)
{
if(s -> top == N - 1)
return ERROR;
s -> top ++;
s -> data[s -> top] = n;
return OK;
}
int pop(SqStack *s,ElemType *n)
{
if(s -> top == -1)
return ERROR;
*n = s -> data[s -> top];
s -> top --;
return OK;
}
//判断栈是否为空
int empty(SqStack *s)
{
return (s -> top == -1);
}
//括号匹配
void match(SqStack *s,ElemType *str)
{
int flag = 0,i = 0; //flag == 1不匹配
ElemType n;
while(i < (int)strlen(str) && strlen(str) % 2 == 0)
{
switch(str[i])
{
case '(':
case '[':
case '{':
push(s,str[i]);
break;
case ')':
pop(s,&n);
if(n != '(')
flag=1;
break;
case ']':
pop(s,&n);
if(n != '[')
flag=1;
break;
case '}':
pop(s,&n);
if(n != '{')
flag=1;
break;
default:
flag=1;
break;
}
if(flag)
break;
i++;
}
if(flag == 0 && empty(s) == 0 && strlen(str) % 2 == 0)
printf("括号匹配成功!\n");
else
printf("括号匹配失败!\n");
}
int main()
{
SqStack s;
Init(&s); //初始化
ElemType str[N];
printf("请输入括号:\n");
gets(str);
match(&s,str);
return 0;
}
运行结果: