括号配对是栈当中的一道经典题,我遇到过的次数估计也有一手之数了。趁着考研复习数据结构又来了一遍。
括号配对通常是值[] ()、{}、[(){}]、[({})]类似这样的是合法的,而[][、[])、[(])这样的是非法的。解决的思路也就是从左往右按顺序入栈,只需要左括号入栈,如果遇到又括号则与栈顶括号匹配,不匹配或者栈顶为空则这一个括号的组合序列就不是匹配的。
栈、可以用数组模拟一个栈,也可用C++ STL中封装好的,还可以自己定义栈。因为考试和面试中喜欢让自己实现栈,所以我按照前面所学,建立一个顺序栈来解决此问题。
code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct{
char data[MaxSize];
int top; // 栈顶指针
}SqStack;
// 初始化
void StackInit(SqStack &S)
{
S.top = 0;
}
// 入栈
bool StackPush(SqStack &S, char e)
{
if(S.top == MaxSize){
return false;
}
S.data[S.top++] = e;
// printf("S.data[S.top-1] = %c\n", S.data[S.top-1]);
return true;
}
// 出栈
bool StackPop(SqStack &S)
{
if(S.top == 0){
return false;
}
S.top--;
return true;
}
// 获取栈顶元素
char GetTop(SqStack S)
{
if(S.top == 0){
exit(1);
}
return S.data[S.top-1];
}
// 判空
bool StackIsEmpty(SqStack S)
{
return (S.top == 0 ? true : false);
}
// 检查括号是否配对
bool check(SqStack S, char e)
{
char stop = GetTop(S); // 获取栈顶元素
bool flag = false;
// 三种配对情况
if(stop == '[' && e == ']'){
flag = true;
}
else if(stop == '(' && e == ')'){
flag = true;
}
else if(stop == '{' && e == '}'){
flag = true;
}
return flag;
}
int main()
{
SqStack S;
StackInit(S);
char str[MaxSize];
scanf("%s", str);
printf("str = %s\n", str);
int len = strlen(str);
for(int i = 0; i < len; i++){
// printf("str[%d] = %c\n", i, str[i]);
if(StackIsEmpty(S)){ // 栈为空直接入栈
StackPush(S, str[i]);
}
else if(check(S, str[i])){ // 当前元素与栈顶元素相同出栈
StackPop(S);
}
else{
StackPush(S, str[i]); // 不同入栈
}
}
if(StackIsEmpty(S)){
printf("Yes\n");
}
else{
printf("No\n");
}
return 0;
}