#include <stdio.h>
#include <stdlib.h>
#define STACKINCREAMENT 10
#define STACK_INIT_SIZE 100
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int status;
typedef char SElemtype;
typedef struct
{
SElemtype *base;
SElemtype *top;
status stacksize;
}sqstack;
//初始化栈
status Init(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 OK;
}
//获取栈顶元素
status Gettop(sqstack *s, SElemtype e)
{
if (s->top == s->base)
return ERROR;
e = *(s->top – 1);
return OK;
}
//压栈
status push(sqstack *s, SElemtype e)
{
if (s->top – s->base >= s->stacksize)
{
s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));
if (!s->base)
exit(OVERFLOW);
s->top = s->base + s->stacksize;
s->stacksize += STACKINCREAMENT;
}
*s->top++ = e;//有了栈顶可以不必弄指针,直接进行栈顶 栈底的加减
return OK;
}
//弹出栈顶
status pop(sqstack *s, SElemtype *e)
{
if (s->top == s->base)
return ERROR;
s->top–;
*e = *(s->top);
//*e = *–s->top;
return OK;
}
//判断是否为空栈
status stackempty(sqstack *s)
{
if (s->top == s->base)
return OK;
return ERROR;
}
//清空栈
status clearstack(sqstack *s)
{
if (s->top == s->base)
return ERROR;
s->top = s->base;
return OK;
}
//括号匹配算法
status Parenthesis_match(sqstack *s, char *str)
{
int i = 0, flag = 0;
SElemtype e;
while (str[i] != ‘\0’)//可以不用求解数组的长度
{
switch (str[i])
{
case ‘{‘:
push(s, str[i]);
break;
case ‘(‘:
push(s, str[i]);
break;
case ‘[‘:
push(s, str[i]);
break;
case ‘)’:
{
pop(s, &e);
if (e != ‘(‘)
flag = 1;
}
break;
case ‘}’:
{
pop(s, &e);
if (e != ‘{‘)
flag = 1;
}
break;
case ‘]’:
{
pop(s, &e);
if (e != ‘[‘)
flag = 1;
}
break;
default:
break;
}
if (flag)//判断是否遇到不可解的情况
break;
i++;
}
if (!flag && stackempty(s))
printf(“括号匹配成功!\n”);
else
printf(“括号匹配失败!\n”);
return OK;
}
int main()
{
char str[100], enter;
sqstack s;
Init(&s);
printf(“请输入字符串:\n”);
scanf(“%s”, str);
//scanf(“%c”, &enter);
Parenthesis_match(&s, str);//进行括号的检测
return 0;
}