【C++数据结构与算法】括号匹配算法
这是从《c++数据结构与程序设计》这本书改过来的一个算法。
会用到c++内置的数据结构栈。
要解决的问题:输入一行括号,判断这行括号是否匹配
算法原理和代码思路
一句话概括算法原理:逐个读入括号,如果遇到左括号,则入栈,如果遇到右括号,则将栈顶元素与当前右括号进行判断,若匹配则出栈,若不匹配则结束判断。
比如给出这样的一行括号:((({}<>())))
我们可以很容易发现,这行括号是匹配的。
我们可以一个个括号进行出入栈分析,分析如下:
首先是4个左括号的入栈,即((({,栈底是(,栈顶是{;
然后遇到了第一个右括号},将}与栈顶元素进行匹配,我们容易发现,{ 和 } 是匹配的,于是我们弹出栈顶元素{,那么这个栈就变成了(((;
继续读取下一个括号,我们读到了<,入栈,栈变成了(((<,栈顶是<;
继续读取下一个括号,我们读到了>,将>和栈顶元素<进行匹配,我们发现<和>是匹配的,于是将<出栈,这个栈就变成了(((;
继续往下,读到(,入栈;
往下,读到),匹配,出栈;
往下,读到),匹配,出栈;
往下,读到),匹配,出栈;
往下,读到),匹配,出栈;
匹配成功!!
再举一个例子,输入(<>,这个显然不匹配,因为没有多余的)和(匹配。
如果只输入>,那也不匹配,因为栈为空,没有栈顶元素和>进行匹配。
代码如下(思路写在注释里面了):
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack <char> open;//建立一个栈
char in;
bool is_matched = true;//是否匹配的bool值
while(1)
{
in = cin.get();//逐个获取输入的括号
if(in == '\n') break;
//cout<< "test " << in << endl;
if( in=='(' || in=='[') //左括号入栈
open.push(in);//我偷懒了,就只用了[]和()这两对括号
if( in==')' || in==']'){//右括号,判断是否匹配
if(open.empty()){//如果栈为空,也就是说没有左括号,那么显然不匹配
//cout << "不匹配" << endl;
is_matched = false;
break;
}
else{
char temp = open.top();
open.pop();
is_matched = ( temp=='(' && in== ')')
||( temp=='[' && in== ']');//是否匹配的bool值
if(!is_matched){
//cout << "不匹配" << endl;
break;
}
}
}
}
if(!open.empty())cout << "不匹配" << endl;
//如果到最后栈不为空,那么就说明还有未能匹配的的左括号,也就是不匹配
else cout << "成功匹配" << endl;
}
欢迎评论,欢迎交流。