编译器括号检查原理:
比如输入:{[]}
程序处理:
1.先压入‘{‘,现在栈为‘{’【这里表示栈内容的时候,是从栈底元素开始写,从左到右表示栈底到栈顶的元素】;
2.取出栈顶元素’{‘,判断输入的第二个符号’[‘是否能与’}‘匹配,判断结果是不匹配;
3.将‘{[’压入栈,现在栈为’{[‘;
4.取出栈顶元素’[‘,判断输入的第三个符号’]‘是否能与’[‘匹配,判断结果是匹配的,现在栈为’{‘
5.取出栈顶元素’{‘,判断输入的第四个符号’}‘是否能与’{‘匹配,判断结果是匹配的,现在栈为空
6.输入的4个符号已经判断完了,接下来判断栈的里边元素的个数,如果元素的个数为0,则说明括号是一一对应的;如果元数的个数不为0,则说明括号不是完全对应的。
C语言实现
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
InitStack(sqStack *s)
{
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if( !s->base )
exit(0);
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
}
Push(sqStack *s, ElemType e)
{
// 栈满,追加空间,鱼油必须懂!
if( s->top - s->base >= s->stackSize )
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if( !s->base )
exit(0);
s->top = s->base + s->stackSize;
s->stackSize = s->stackSize + STACKINCREMENT;
}
*(s->top) = e; // 存放数据
s->top++;
}
Pop(sqStack *s, ElemType *e)
{
if( s->top == s->base )
return;
*e = *--(s->top); // 将栈顶元素弹出并修改栈顶指针
}
int StackLen(sqStack s)
{
return (s.top - s.base);
}
int match(char e, char c)
{
if( e=='(' && c==')' )
return 1;
if( e=='[' && c==']' )
return 1;
if( e=='<' && c=='>' )
return 1;
if( e=='{' && c=='}' )
return 1;
if( e=='\'' && c=='\'' )
return 1;
if( e=='\"' && c=='\"' )
return 1;
return 0;
}
int main()
{
sqStack s;
char c, e;
InitStack( &s );
printf("请输入一系列字符串,以#作为结束标志:");
scanf("%c", &c);
while( c != '#' )
{
// 如果是括号,就压栈
if( c=='(' || c==')' || c=='[' || c==']' || c=='<' || c=='>' || c=='\'' || c=='\"' || c=='{' || c=='}' )
{
if( !StackLen(s) )
{
Push(&s, c);
}
else
{
Pop(&s, &e);
if( !match(e, c) )
{
Push(&s, e);
Push(&s, c);
}
}
}
scanf("%c", &c); // 输入下一个字符
}
if( !StackLen(s) )
{
printf("\n输入字符串中的括号完全匹配!\n");
}
else
{
printf("\n输入字符串中的括号不完全匹配!\n");
}
return 0;
}