/*括号匹配算法*/
#include<stdio.h>
#define FALSE 0
#define TRUE 1
#define MAXSIZE 100
typedef char DataType;
//定义栈
typedef struct stack{
DataType data[MAXSIZE];
int top;
}SeqStack;
//初始化栈
void InitStack(SeqStack *s)
{
s->top = -1;
}
//判断栈是否为空
int IsEmpty(SeqStack *s)
{
if(s->top == -1)
return TRUE;
return FALSE;
}
//判断栈是否已满
int IsFull(SeqStack *s)
{
if(s->top == MAXSIZE-1)
return TRUE;
return FALSE;
}
//出栈
void PopStack(SeqStack *s, DataType temp)
{
if(IsEmpty(s))
return;
temp = s->data[s->top];
s->top --;
}
//压栈
void PushStack(SeqStack *s,DataType temp)
{
if(IsFull(s))
return;
s->top ++ ;
s->data[s->top]=temp;
}
//判断两个括号是否匹配
int Match(char chone,char chtwo)
{
if(chone=='(' && chtwo==')')
return TRUE;
else if(chone == '{' && chtwo == '}')
return TRUE;
else if(chone == '[' && chtwo == ']')
return TRUE;
else
return FALSE;
}
//取栈顶元素
void GetTopStack(SeqStack *s , DataType *temp)
{
if(IsEmpty(s))
return;
*temp = s->data[s->top];
}
void BracketMatch(char *str)
{
SeqStack s;
int i;
char ch;
InitStack(&s);
for(i=0 ; str[i]!='\0';i++ )
{
switch(str[i]){
case '(':
case '[':
case '{':
PushStack(&s,str[i]);
break;
case ')':
case ']':
case '}':
if(IsEmpty(&s))
{
printf("右括号多余\n");
return;
}else{
GetTopStack(&s,&ch);
if(Match(ch,str[i]))
PopStack(&s,ch);
else{
printf("\n对应的右括号不同类\n");
return;
}/*if*/
}/*else*/
}/*for*/
}/*switch*/
if(IsEmpty(&s))
printf("\n括号匹配\n");
else
printf("\n左括号多余\n");
}
int main()
{
char str[MAXSIZE];
int i;
printf("Input the bracket string: \n");
scanf("%s",str);
BracketMatch(str);
return 1;
}
转载于:https://blog.51cto.com/hxm1236/1313636