栈在括号匹配中的应用
问题,如何实现对括号的匹配呢?就像在写代码的过程中,如果理应成对出现的括号缺少了左括号,我们的IDE如何进行判断的呢?
思路:
- 最后出现的左括号最先被被匹配----类似于栈的(LIFO)后进先出特性;
- 每出现一个右括号,就“消耗”一个左括号——类型栈的出栈操作。
算法步骤
- 初始时设置一个空栈,顺序读入括号;
- 若是右括号——则1:使得治愈栈顶的最急迫期待得以消解,或者2:不合法情况,括号不匹配,推出程序)
- 若是左括号——作为一个更新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待急迫性降了一级——左括号置为栈顶。
- 算法结束时,栈为空,否则括号序列不匹配。
代码实现
主函数的核心思路需要用到上述算法,但也会有用到栈的基本操作,这就需要参看之前的博客栈——栈的基本概念和基本操作
#define MaxSize 10 //定义栈中元素的最大个数
//定义栈的结构
typedef struct{
char data [MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack S;
//初始化栈
void InitStack(SqStack &S){
S.top=-1;//初始化栈顶指针,开始栈中无元素。
}
//函数功能:判断栈空
bool StackEmpty(SqStack S){
if(S.top=-1);//栈空
return ture;
else //不空
return false;
}
//函数功能——新元素x入栈
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1)//栈满,报错
return false;
S.data[++S.top]=x; //栈指针先加一,新元素入栈。top值先加一,再使用top的指针放入新元素
return ture;
}
//函数功能——栈顶元素出栈,并用x返回
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1)//栈空,报错
return false;
x=S.data[S.top--] //栈顶元素先出栈.栈指针再减1;先使用top的值获得对应的栈顶元素,然后top的值再减一。
return ture;
}
//函数功能:实现括号匹配
booL bracketCheck(char str[], int length) {
InitStack(S); //初始化- 个栈
for (int i=0; i<length; i++){
if (str[i]=='('||str[i]=='['|| str[i]=='{'){
Push(S,str[i]); //扫描到的都是左括号,入栈操作
}
else{
if(StackEmpty(S)){ //扫描到右括号,且当前栈空;
return false;
}
char topElem;
Pop(S,topElem); // 栈顶元素出栈
if(str[i]==')' && topElem!='(')
return false;
if(str[i]==']' && topElem!='[')
return false;
if(str[i]=='}' && topElem!='{')
return false;
}
}
return StackEmpty(S); //检索完全部括号后, 栈空说明匹配成功
}
备注:之前的博客写的有点啰嗦,内容过多了也不太好,所以就简洁一点!
还请多多点赞关注支持!!!