栈在括号匹配中的应用
问题描述
输入一字符串,检查字符串中 { }、[ ]、( ) 三种括号是否成对出现。不同括号间不能交叉出现且左右括号顺序不能颠倒,如 ) (、{ ( } )等。
基本思路
利用栈的特性,发现左括号就入栈,然后检索到右括号与栈顶的左括号比对,如果为同一种括号则栈顶括号出栈;如果不是同一种括号(交叉)或者栈为空(只有右括号)则匹配失败。
最后若栈空则说明括号匹配成功
代码实现
#define MaxSize 50
typedef struct {
char data[MaxSize];
int top;
}SqStack;
void StackTest();
bool match(char str[]);
//初始化一个空栈
void InitStack(SqStack &S){
S.top = -1;
}
//判断一个栈是否为空
bool StackEmpty(SqStack S){
return S.top == -1;
}
//入栈
bool Push(SqStack &S,char x){
if (S.top == MaxSize - 1) return false;
S.data[++S.top] = x;
return true;
}
//弹栈
bool Pop(SqStack &S,char &x){
if (S.top == -1) return false;
x = S.data[S.top--];
return true;
}
//括号匹配
bool match(char str[]){
SqStack S;
InitStack(S);
for (int i = 0;str[i] != '\0';i++){
if (str[i] == '{' || str[i] == '[' || str[i] == '(') Push(S,str[i]);//左括号就压栈
else {
char c;
Pop(S,c);
if ((c == '{' && str[i] == '}')||(c == '[' && str[i] == ']')||(c == '(' && str[i] == ')')){//右括号就弹栈
continue;
} else return false;
}
}
return true;
}
测试样例
char arr[] = "{[()]}";
char arr[] = "{}()[]]";