使用棧來實現
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct elem
{
int date;
};
typedef struct LinkStack
{
elem elem_date;
LinkStack *next;
}LinkStack;
//初始化
void Init(LinkStack **top)//棧只有頭,沒有底
{
*top = (LinkStack*)malloc(sizeof(LinkStack));
(*top)->next = NULL;
}
//入棧
int push(LinkStack *Top, int date)
{
LinkStack *p = (LinkStack*)malloc(sizeof(LinkStack));
if (p == NULL)
{
printf("申請空間失敗\n");
return -1;
}
p->elem_date.date = date;
p->next = Top->next;
Top->next = p;
return 0;
}
//出棧
int pop(LinkStack *top, int &date)
{
if (top->next == NULL)
{
date = -1;
return -1;
}
LinkStack*p = (LinkStack*)malloc(sizeof(LinkStack));
p = top->next;
date = p->elem_date.date;
top->next = p->next;
free(p);
return 0;
}
//獲得棧頂元素
int get(LinkStack *top, int &date)
{
if (top->next == NULL)
{
date = -1;
return -1;
}
date = top->next->elem_date.date;
return 0;
}
//判空
int empty(LinkStack *top)
{
if (top->next == NULL)
{
return 1;
}
return 0;
}
//() {} []
//01 23 45
bool mate(char *buf)
{
LinkStack *stack;
Init(&stack);
int buf1[MAX] = {};
int i = 0;
while (i<strlen(buf))
{
switch (buf[i])
{
case '(':buf1[i] = 0; break;
case ')':buf1[i] = 1; break;
case '{':buf1[i] = 2; break;
case '}':buf1[i] = 3; break;
case '[':buf1[i] = 4; break;
case ']':buf1[i] = 5; break;
default:
break;
}
i++;
}
buf1[i] = 6;
i = 0;
int tmp = 0;
while (buf1[i] != 6)
{
switch (buf1[i])
{
case 0:push(stack, buf1[i]); break;
case 2:push(stack, buf1[i]); break;
case 4:push(stack, buf1[i]); break;
default:
break;
}
switch (buf1[i])
{
case 1:
{
pop(stack, tmp);
if (tmp != 0)
{
return false;
}
}
break;
case 3:
{
pop(stack,tmp);
if (tmp != 2)
{
return false;
}
break;
}
case 5:
{
pop(stack,tmp);
if (tmp != 4)
{
return false;
}
break;
}
default:break;
}
i++;
}
if (empty(stack))
{
return true;
}
return false;
}
int main(void)
{
char buf[MAX] = "";
gets_s(buf);
if (mate(buf))
printf("括號可以匹配\n");
else
printf("括號不可以匹配\n");
return 0;
}