利用栈实现,注意非法情况的检测处理。
#include <stdlib.h>
#include <stdio.h>
#define MAXSIZE 100
typedef char Datatype;
typedef struct
{
int top;
Datatype data[MAXSIZE];
}seqstack,*pseqstack;
pseqstack init_stack(void)
{
pseqstack s;
s = (pseqstack)malloc(sizeof(seqstack));
if (s)
s->top = -1;
else
printf("申请失败");
return s;
}
int empty_stack(pseqstack s)
{
if (!s)
{
printf("栈不存在");
return(-1);
}
if (s->top == -1)
return(1);
else
return(0);
}
int push_stack(pseqstack s, Datatype dat)
{
if (!s)
{
printf("栈不存在,无法入栈");
return(-1);
}
if (s->top == MAXSIZE - 1)
{
printf("栈满,无法插入");
return(0);
}
s->top++;
s->data[s->top] = dat;
return(1);
}
int pop_stack(pseqstack s, Datatype *dat)
{
if (!s)
{
printf("栈不存在,无法出栈");
return(-1);
}
if (empty_stack(s))
{
printf("栈空,无法出栈");
return(0);
}
else
{
*dat = s->data[s->top];
s->top--;
return(1);
}
}
int get_top(pseqstack s, Datatype *t)
{
if (!s)
{
printf("栈不存在");
return(-1);
}
if (empty_stack(s))
{
printf("栈空,无法出栈");
return(0);
}
else
{
*t = s->data[s->top];
return(1);
}
}
void destroy_stack(pseqstack *s)
{
if (*s)
free(*s);
*s = NULL;
}
void display_stack(pseqstack s)
{
if (! s)
{
printf("栈不存在");
}
else
{
for (int i = -1; i < s->top; i++)
printf("%d\n", s->data[i + 1]);
}
}
int brackets_matching(const char* &s)
{
pseqstack st = init_stack();
Datatype temp;
while (s&&*s)
{
if (*s == '(' || *s == '[' || *s == '{')
{
push_stack(st, *s++);
}
else
{
if (*s == ')' || *s == ']' || *s == '}')
{
if (st->data[st->top] - *s == -1 || st->data[st->top] - *s == -2)
{
pop_stack(st, &temp);
s++;
}
else
{
printf("输入非法!\n");
return(0);
}
}
else
{
s++;
}
}
}
if (empty_stack(st))
{
printf("括号输入无误!\n");
return(1);
}
else
{
printf("输入非法,缺少括号!\n");
return(0);
}
destroy_stack(&st);
}
int main()
{
const char *t1 = "{[(3+5)*4-7]/2+4*5}/9";
const char *t2 = "{[(3+5)*4-7]/2+4*5}(/9";
const char *t3 = "{[(3+5)*4-7}/2+4*5]/9";
const char *t4 = "{[(3+5)*4-7]/2+4*5}/9}";
int f1 = brackets_matching(t1);
int f2 = brackets_matching(t2);
int f3 = brackets_matching(t3);
int f4 = brackets_matching(t4);
while (true)
{
}
}