(((([]))))
1.根据括号的匹配可知最后一个出现的“左”括号最先被匹配(相当于栈的先进后出)
2.每次出现一个右括号,就消耗(出栈)一个左括号。
所以有遇到左括号就入栈,遇到右括号就消耗一个左括号。
规则: 所有括号要都能两两配对(左括号与右括号)不能有单独的一个括号,其次必须一一对应如“(” 只能对应 “)”不能对应一个"]"
不匹配情况
对于此的逻辑有 :第一步:开始是否有未处理的括号如果没有判断栈是否为空,为空则匹配成功,若不空则匹配失败。
第二步:如果有未被处理的括号a,扫描a是否为左括号,如果为左括号则压入栈,如果不为左括号判断栈是否为空,若为空则匹配失败,若不为空则弹出栈顶元素b,判断b与a是否匹配,若匹配则匹配成功,否则匹配失败。
算法实现
首先定义一个栈
#define MaxSize 10 //定义一个栈中元素的最大·个数
typedef struct{
char data[MaxSize-1]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
初始化栈
void InitStack(SqStack &s){
s.top=-1;
}
判断栈是否为空
bool StackEmpty(SqStack s){
if(s.top==-1) return true;
}
新元素入栈
bool push(SqStack &s,char x){
if(s.top==MaxSize-1)
return false;
s.data[++s.top]=x; //等价于 s.top=s.top+1 s.data[s.top]=x
return true;
}
栈顶元素出栈
bool pop(SqStack &s,ElemType &x ){
if(s.top==-1)
return false;
x=s.data[s.top--];
return true;
}
具体实现
bool bracketCheck(char str[],int length){
SqStack S;
InitStack(S);//初始化栈
for(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(topElem=='('&&str[i]!=')')
return false;
if(topElem=='['&&str[i]!=']')
return false;
if(topElem=='{'&&str[i]!='}')
return false;
}
}
return StackEmpty(s);
}