利用栈,实现括号匹配
#include<stdio.h>
#include<stdlib.h>
#include<Define.h>
#include<string.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *S); //构造一个空栈
Status DestroyStack(SqStack *S); //销毁一个栈
Status GetTop(SqStack S, char *e); //用e返回栈顶的元素
Status Push(SqStack *S, char e); //插入元素e为新的栈顶元素
Status Pop(SqStack *S, char *e); //删除栈顶的元素,用e返回
Status Test(SqStack *S); //括号检测
Status InitStack(SqStack *S) //构造一个空栈
{
S->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!S->base)
{
exit(OVERFLOW);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
// printf("初始化成功!\n");
return OK;
}
Status GetTop(SqStack S, char *e) //用e返回栈顶的元素
{
if (S.top == S.base)
{
return ERROR;
}
(*e) = *(--S.top);
return OK;
}
Status Push(SqStack *S, char e) //插入元素e为新的栈顶元素
{
if (S->top - S->base >= S->stacksize)
{
S->base = (char *)realloc(S->base,
(S->stacksize + STACKINCREMENT) * sizeof(char));
if (! S->base)
{
exit(OVERFLOW);
}
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
return OK;
}
Status Pop(SqStack *S, char *e)
{
if (S->top == S->base)
{
return ERROR;
}
else
{
*e = * --S->top;
}
return OK;
}
Status Test(SqStack *S) //括号检测
{
char ch[100], e;
int i, j;
printf("请输入括号:\n");
scanf("%s", ch);
j = strlen(ch);
for (i = 0; i < j; i ++)
{
switch(ch[i])
{
case '{':
Push(&(*S), ch[i]);
break;
case '[':
Push(&(*S), ch[i]);
break;
case '(':
Push(&(*S), ch[i]);
break;
case '"':
if (* (S->top - 1) == '"')
{
Pop(&(*S), &e);
break;
}
else
{
Push(&(*S), ch[i]);
}
case '“':
Push(&(*S), ch[i]);
break;
case '”':
if (* (S->top - 1) == '“')
{
Pop(&(*S), &e);
break;
}
else if (* (S->top - 1) == '”')
{
return FALSE;
}
else
{
Push(&(*S), ch[i]);
break;
}
/* case ''':
if (* (S->top - 1) == ''')
{
Pop(&(*S), &e);
break;
}
else
{
Push(&(*S), ch[i]);
}*/
case '‘':
Push(&(*S), ch[i]);
break;
case '’':
if (* (S->top - 1) == '‘')
{
Pop(&(*S), &e);
break;
}
else if (* (S->top - 1) == '’')
{
return FALSE;
}
else
{
Push(&(*S), ch[i]);
break;
}
case ')':
if (* (S->top - 1) == '(')
{
Pop(&(*S), &e);
break;
}
else if (* (S->top - 1) == ')')
{
return FALSE;
}
else
{
Push(&(*S), ch[i]);
break;
}
case ']':
if (* (S->top - 1) == '[')
{
Pop(&(*S), &e);
break;
}
else if (* (S->top - 1) == ']')
{
return FALSE;
}
else
{
Push(&(*S), ch[i]);
break;
}
case '}':
if (* (S->top - 1) == '{')
{
Pop(&(*S), &e);
break;
}
else if (* (S->top - 1) == '}')
{
return FALSE;
}
else
{
Push(&(*S), ch[i]);
break;
}
}
}
if (S->top == S->base)
{
return OK;
}
else
{
return ERROR;
}
}
int main(void)
{
SqStack S;
// InitStack(&S);
InitStack(&S);
if (Test(&S))
{
printf("括号合法.\n");
}
else
{
printf("括号不合法.\n");
}
printf("继续输入? (1 OR 0)");
return 0;
}