数据结构之括弧匹配
算法思想:从缓冲区读入一个字符,判断该字符是左括号还是右括号中的一个抑或是其余字符。若为左括号则压栈,若为右括号则与栈顶元素匹配,匹配成功则栈顶元素出栈,读入下一个字符,知道最后一个字符"\n"。最后进行判断:栈是否为空、读入字符是否为该字符串最后一个字符,若是,则匹配成功,若不是,则匹配失败。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1 /*状态码预定义*/
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef char SElemtype; /*数据类型*/
typedef int Status;
typedef struct{
SElemtype *base; /*栈底*/
SElemtype *top; /*栈顶*/
int stacksize; /*栈长度*/
}SqStack;
Status InitStack(SqStack *S) /*栈的初始化操作*/
{
S->base = (SElemtype *)malloc(STACK_INIT_SIZE*sizeof(SElemtype));
if(!S->base) exit(OVERFLOW); /*分配内存失败则返回错误*/
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return 1;
}
SElemtype GetTop(SqStack S) /*获取栈顶元素*/
{
SElemtype e;
if(S.top==S.base) return ERROR;
e = *(S.top-1);
return e;
}
Status Push(SqStack *S,SElemtype e) /*压栈操作*/
{
if(S->top - S->base>=S->stacksize)
{
S->base = (SElemtype *)realloc(S->base,(S->stacksize+STACK_INIT_SIZE)*sizeof(SElemtype));
S->top = S->base + S->stacksize;
S->stacksize += STACK_INIT_SIZE;
}
*(S->top++) = e;
return OK;
}
Status Pop(SqStack *S,SElemtype *e) /*出栈操作*/
{
if(S->top == S->base) return ERROR;
e = (--S->top);
return OK;
}
Status MatchBracket(SqStack S) /*括号匹配*/
{
SElemtype ch,e;
printf("Please enter the bracket string to match:");
do
{
ch = getchar();
if(ch=='('||ch=='{'||ch=='[') /*是否为左括号*/
Push(&S,ch);
else if((ch==')'&&(GetTop(S)=='('))||(ch=='}'&&(GetTop(S)=='{'))||(ch==']'&&(GetTop(S)=='['))) /*为右括号是是否与栈顶元素匹配*/
Pop(&S,&e);
else
break;
} while (ch!='\n'); /*最后一个字符*/
if(S.top==S.base&&ch=='\n') /*栈空?*/
return OK;
else
return ERROR;
}
void main()
{
SqStack S;
InitStack(&S);
if(MatchBracket(S))
printf("Successfully match!\n");
else
printf("Fairly match!\n");
}