//括号匹配是否匹配
//如: ([]()) 或 [([][])]等为正确格式,[(]) 或 ([()) 或 (()]均为不正确格式
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INIT_STACK_SIZE 80
#define STACKINCREMENT 10
#define MAX 50
typedef struct{
char *elem;
int top;
int stacksize;
}SqStack;
SqStack S; //将栈设置为全局变量
void Init(SqStack S);
int Process(SqStack S,char expression[],int len);
void Push(SqStack S,char e);
int Detect(SqStack S);
void Pop(SqStack S);
int main(void)
{
char expression[50];
int len;
printf("Please input string:");
scanf("%s",expression);
len=strlen(expression);
Init(S);
if(Process(S,expression,len)) //检测括号是否配对情况
printf("Success.\n");
else
printf("Failure.\n");
return 0;
}
void Init(SqStack S) //栈初始化
{
if((S.elem=(char *)malloc(INIT_STACK_SIZE * sizeof(char)))==NULL)
{
exit(1);
}
S.top=0;
S.stacksize=INIT_STACK_SIZE;
}
int Process(SqStack S,char expression[],int len)
{
int i,flag;
flag=1; //设置个标志
for(i=0;i<=len-1;i++)
{
switch(expression[i])
{
case '(': //如果是左侧括号就压入栈
Push(S,expression[i]);
break;
case '[':
Push(S,expression[i]);
break;
case '{':
Push(S,expression[i]);
break;
case ')': //Detect()的功能是检测栈是否为空
if(Detect(S) && (S.elem[S.top-1]=='('))
Pop(S); //Pop()的功能是栈顶元素出栈
else
{
flag=0;
return flag;
}
break;
case ']':
if(Detect(S) && (S.elem[S.top-1]=='['))
Pop(S);
else
{
flag=0;
return flag;
}
break;
case '}':
if(Detect(S) && (S.elem[S.top-1]=='{'))
Pop(S);
else
{
flag=0;
return flag;
}
break;
}//switch
}//for
return flag; //将标志的结果返回到main()
}
void Push(SqStack S,char e) //入栈
{
char *newbase;
S.elem[S.top++]=e;
if(S.top>=S.stacksize)
{
if((newbase=(char *)realloc(S.elem,(S.stacksize + STACKINCREMENT) * sizeof(char)))==NULL)
{
exit(1);
}
S.elem=newbase;
S.stacksize+=STACKINCREMENT;
}
}
int Detect(SqStack S) //检测栈是否为空函数
{
int flag=1;
if(S.top==0)
flag=0;
return flag;
}
void Pop(SqStack S) //Pop()功能是栈顶元素初栈
{
S.top=S.top-1;
}
以上程序为什么不能实现?