father::算法 括号匹配 括号闭合 括号判断
1. 过程梗概:
1. 功能描述:
- 检测一串字符串, 多种括号成对出现, 并返回检查结果
2. 梗概:
- 读取字符串, 按读取顺序记录下左括号种类
- 读取到右括号时就要判断了(右括号决定是否成对)
- 如果右括号读取顺序与左括号记录循序相反且对应
- 则ture
- 否则
- 则false
- 如果右括号读取顺序与左括号记录循序相反且对应
3. 算法实现技术
- 用栈存储左括号
- 因为左括号输入顺序和读取顺序刚好相反
4. 算法详细描述:
- 对每个字符遍历扫描
- 如果为左括号
- 压入栈中
- 如果为右括号
- 如果栈为空
- 则return 1 表示右括号多余
- 否则
- 与栈顶左括号比较
- 如果括号类型匹配
- 栈顶出栈
- 否则
- return 2 表示左右括号不同类
- 如果括号类型匹配
- 与栈顶左括号比较
- 如果栈为空
- 如果栈为空
- return 0 表示括号成对存在
- 否则
- return 3 表示左括号多余
2. C语言代码实现
int Match(char ch1,char ch2)
{ // 判断左括号ch1和右ch2是否匹配,匹配返回TRUE,否则返回FALSE
switch (ch1)
{
case '(':if(ch2!=')')return 0;break;
case '[':if(ch2!=']')return 0;break;
case '{':if(ch2!='}')return 0;break;
}
return 1;
}
int BracketMatch(char *str)
{ // str[]中为输入的字符串,利用堆栈技术来检查该字符串中的括号是否匹配
SeqStack S; int i; char ch;
InitStack(&S);
for (i=0; str[i]!='\0'; i++) // 对字符串中的字符逐一扫描
{ switch(str[i])
{ case '(':
case '[':
case '{': Push(&S,str[i]); break;
case ')':
case ']':
case '}': if ( IsEmpty(&S) ) return 2;
GetTop(&S,&ch);
if ( Match(ch,str[i]) ) // 用Match判断两个括号是否匹配
Pop(&S,&ch); // 已匹配的左括号出栈
else return 3;
}
}
return ( IsEmpty(&S)? 0 : 1 );
}js代码实现
- child::获取括号范围