思想:每读入一个括号:
(1)若是左括号,则直接入栈,等待相匹配的同类右括号。
(2)若是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况。
#include<stdio.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
#define StackElementType char
/*顺序栈*/
typedef struct
{
StackElementType elem[Stack_Size]; /*用来存放栈中元素的一维数组*/
int top; /*用来存放栈顶元素的下标,top为-1表示空栈*/
} SeqStack;
/*初始化*/
void InitStack(SeqStack *S)
{
/*构造一个空栈S*/
S->top = -1;
}
int Push(SeqStack *S,StackElementType x)
{
if(S->top==Stack_Size-1)
return(FALSE); /*栈已满*/
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
/*判栈空*/
int IsEmpty(SeqStack *S) /*判断栈S为空栈时返回值为真,反之为假*/
{
return(S->top==-1?TRUE:FALSE);
}
/*取栈顶元素。*/
int GetTop(SeqStack *S,StackElementType *x)
{
/* 将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变 */
if(S->top == -1) /*栈为空*/
return(FALSE);
else
{
*x = S->elem[S->top];
return(TRUE);
}
}
/*进行匹配*/
int Match(char ch,char str)
{
if(ch=='('&&str==')')
{
return TRUE;
}
else if(ch=='['&&str==']')
{
return TRUE;
}
else if(ch=='{'&&str=='}')
{
return TRUE;
}
else
return FALSE;
}
int Pop(SeqStack *S,StackElementType *x)
{
/* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */
if(S->top == -1) /*栈为空*/
return(FALSE);
else
{
*x = S->elem[S->top];
S->top--; /* 修改栈顶指针 */
return(TRUE);
}
}
void BracketMatch(char *str) /* str[]中为输入的字符串,利用堆栈技术来检查该字符串中的括号是否匹配*/
{
SeqStack S;
int i;
char ch;
InitStack(&S);
for(i=0; str[i]!='\0'; i++) /*对字符串中的字符逐一扫描*/
{
switch(str[i])
{
case '(':
case '[':
case '{':
Push(&S,str[i]);
break;
case ')':
case ']':
case '}':
if(IsEmpty(&S))/*栈为空返回的是1,就是第一个入栈的字符就是右括号*/
{
printf("\n右括号多余!");
return;
}
else
{
GetTop(&S,&ch);
if(Match(ch,str[i])) /*用Match判断两个括号是否匹配*/
Pop(&S,&ch); /*已匹配的左括号出栈*/
else
{
printf("\n对应的左右括号不同类!");
return;
}
}
break;
}
}
if(IsEmpty(&S))
printf("\n括号匹配!");
else
printf("\n左括号多余!");
}
int main()
{
char str[100];
printf("please input:");
gets(str);
BracketMatch(str);/*括号匹配*/
return 0;
}