括号匹配算法
2017-02-13 11:11
239 查看
括号匹配算法
概述
括号匹配在很多字符串处理的场景中时常被用到,诸如各大IDE括号不匹配的错误提示,编译器编译时检查应该成对出现的括号是否符合要求等,在这里我们就直接使用一种比较常规,但效率不差的方法去解决括号匹配的问题就行了。栈方法匹配问题
为了方便描述,对于需要做匹配的两个符号,比如’(‘和’)’,前者可称为左侧符号,后者可称为右侧符号。在做符号匹配时,如果以左侧符号为标准,左侧符号需要右侧符号来完成匹配,但是由于诸如括号这类的符号可以做嵌套,所以左侧符号之后既能有左侧符号,也能有右侧符号,处理起来很麻烦。以右侧符号为标准就没有这个问题了,每一个右侧符号都需要一个左侧符号来匹配,并且要求该右侧符号之前最近的一个符号必须是相匹配的左侧符号,这样处理起来就方便多了。 利用栈可以很容易地解决这个问题,在遍历字符串时,若当前位置是右侧符号,那它需要一个该位置之前最近的一个符号为左侧符号,否则不匹配。定义一个栈,用以记录遍历到当前位置时,所遇到的左侧符号,处理方式是这样的,每当遇到一个右侧符号时,检查栈是否为空,若此时栈不为空,则对栈进行pop操作表明顶部元素已被匹配,否则为不匹配情况,直接返回false。当整个字符串遍历结束,我们就可以通过判断该栈是否为空来判断整个字符串中的符号是否匹配。具体代码如下:
Code
bool is_match(const string &str) { size_t len = str.length(); stack<char> s; int i; for (i = 0; i < len; ++i) { if (str[i] == '(') { s.push(str[i]); continue; } if (str[i] == ')') { if (!s.empty() && s.top() == '(') { s.pop(); continue; } } } if (!s.empty()) { return false; } return true; }
扩展情况
这种方法不仅能处理括号的情况,也能处理字符串中包含不止一种成对出现符号需要匹配的问题,只要添加相对的左侧符号的情况就行了。相关文章推荐
- 括号匹配算法的C++代码实现
- 算法:括号匹配(栈的应用)-数据结构(7)
- 括号匹配 算法
- 括号匹配算法
- 笔试面试算法经典--最长括号匹配
- 指针实现的栈(包含进制转换算法实现,括号匹配算法实现)【8】
- 【算法】 括号匹配(二)
- 算法-括号匹配
- 常见算法题:判断表达式括号是否匹配
- n对括号可以有多少种匹配排列方式(算法面试题)
- 简单算法——使用栈实现括号匹配检验
- 括号匹配算法思想
- 自己写的括号匹配算法
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- 算法学习 - 括号匹配(栈实现)C++
- 验证括号匹配-算法
- 算法分析——括号匹配
- 利用栈实现括号匹配算法!
- PHP数据结构之六 PHP栈的应用举例【数制转换和括号匹配算法】
- 趣味算法-括号匹配