在之前的文章中,作者以及介绍过了栈以及栈的相关操作。
在本章中,作者将于大家一起了解一下栈的实际应用——利用栈解决括号匹配问题。
什么是括号匹配问题呢?例如“(())”这样的括号它们就是匹配的,左括号与右括号刚好搭配起来,形成合法的式子,而例如“(()”或“(}”这样的括号就是不匹配的。
我们可以发现,如果想要使用代码实现这种算法,那么可以创建一个先进后出的线性表,在遇到左括号时将其放入线性表中,遇到又括号时将已经放入线性表中的左括号拿出来,看看两者是否匹配。然后循环遍历线性表中的全部元素即可。
而我们之前也已经了解过,栈就是一种先进后出的线性表,接下来我们就来看看如何使用代码来实现这一算法!
一,首先初始化一个顺序栈:
#includestdio.h
#includestdlib.h
#includemalloc.h
#defineMaxSize10
typedefstruct{
chardata[MaxSize];
inttop;
}SqStack;
voidInitStack(SqStacks){
s.top=-1;
}
二,判断栈空操作:
boolStackEmpty(SqStacks){
if(s.top==-1){
returntrue;
//TODO
}else{
returnfalse;
}
}
三,入栈和出栈:
boolPush(SqStacks,charx){
if(s.top==MaxSize-1){
returnfalse;
//TODO
}
s.top=s.top+1;
s.data[s.top]=x;
returntrue;
}
boolPop(SqStackS,charx){
if(S.top==-1){
returnfalse;
//TODO
}
x=S.data[S.top];
S.top=S.top-1;
returntrue;
}
四,判断括号匹配:
boolbracketCheck(chars[],intlength){
SqStackS;
InitStack(S);
for(inti=0;ilength;i++){
if(s==(
s==[
s=={){
Push(S,s); //如果检查到左括号那么就入栈
//TODO
}else{
if(StackEmpty(S)){
returnfalse;//如果检查到右括号,那么就检查栈是否空,空则代表不匹配
} //TODO
chartope;
Pop(S,tope);
if(s==)tope!=(){
returnfalse;
//TODO
}
if(s==]tope!=[){
returnfalse;
//TODO
}
if(s==}tope!={){
returnfalse;
//TODO
}
}
//TODO
}
returnStackEmpty(S);//最后返回的值是true则代表匹配,否则不匹配
}
本篇文章到此就结束了,欢迎大家