括号匹配的算法思想:
初始化一个空栈,扫描表达式,依次读入字符,知道扫描完或者出现错误匹配。对于读入的每个字符,分以下情况处理:
(1)、如果是‘’(“”或“【”,将其压入栈。
(2)、如果是“)”,则根据当前栈顶元素的值分情况考虑。若栈顶元素是“(”,则匹配成功,否则为非法情况。
(3)、如果是“】”,则根据当前栈顶元素的值分情况考虑。若栈顶元素是“【”,则匹配成功,否则为非法情况。
——————————C代码——————VC++6.0编译成功,成功运行—————————————————
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int Status;
typedef char SElemType;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define STACK_INNT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
S.base= (SElemType *) malloc(STACK_INNT_SIZE * sizeof(SElemType) ) ;
if(!S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INNT_SIZE;
return OK;
}
Status DestoryStack(SqStack &S)
{
free(S.base);
S.base=S.top=NULL;
return OK;
}
Status ClearStack(SqStack &S)
{
S.top=S.base;
return OK;
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base)
return TRUE;
return FALSE;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType));
if(S.base==NULL)
{
printf("malloc failed.\n");
exit(OVERFLOW);
}
S.top=S.base+S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
Status GetTop(SqStack S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return OK;
}
void Matching()
{
SqStack S;
SElemType ch[80],*p,e;
InitStack(S);
printf("请输入表达式:\n");
gets(ch);
p=ch;
while(*p)
{
switch(*p){
case '(':
case '[':
Push(S,*p++);
break;
case ')':
case ']':
if(!StackEmpty(S))
{
Pop(S,e);
if(*p==')'&& e!='('||*p=='['&& e!=']')
{
printf("左右括号不配对\n");
return;
}
else
{
p++;
break;
}
}
else
{
printf("缺少左括号\n");
return;
}
default:p++;
}
}
if(StackEmpty(S))
printf("括号匹配.\n");
else
printf("缺少右括号.\n");
}
int main()
{
Matching();
system("pause");
return 0;
}