今天带来的是括号匹配算法。
题目描述
输入
输出
样例输入
样例输出
这是个使用栈解决的典型题目。
对一个给定的括号序列比如:{[()]}{]
首先判断是否是左括号如果是,那么把它保存到栈里面(只让左括号存入),如果不是,就进行我们的判断环节,比如对上面给出的例子,栈里面保存了{,[,(。当遇到)时,开始判断。
那么具体怎么判断呢?
对于一个序列,它其中的括号是否匹配,标志就是右括号总有一个“相邻”的左括号与之对应。
比如{()},很明显是匹配的,因为你看到了),而它的左边刚好是一个 ( ,因此 () 匹配,接下来你就不再看(,相当于 ( 出栈,接着是 } ,由于 ( 已经出栈,与之相邻的就是 { ,因此匹配。
再来看一个例子,{[}] ,入栈的是{ [,右括号是 } ,与它相邻的是 [ ,因此不匹配。接下来的 ] 也就不用判断了
还有一种情况就是不能完全匹配,例如,{[] ,这种情况也需要考虑进去。
具体代码实现如下:
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
bool isbalance(const string& str)
{
int len =str.size();
stack<char> mystack;
for(int i=0; i<len; ++i)
{
if(str[i]=='['||str[i]=='{'||str[i]=='('||str[i]=='<')
mystack.push(str[i]);
if(str[i]==']'||str[i]=='}'||str[i]==')'||str[i]=='>')
{
if(mystack.empty())
{
return false;
}
switch(str[i])
{
case ']':
{
if('['!=mystack.top())
return false;
mystack.pop();
break;
}
case '}':
{
if('{'!=mystack.top())
return false;
mystack.pop();
break;
}
case ')':
{
if('('!=mystack.top())
return false;
mystack.pop();
break;
}
case '>':
{
if('<'!=mystack.top())
return false;
mystack.pop();
break;
}
}
}
}
if(mystack.empty())
return true;
else
{
mystack.pop();
return false;
}
}
int main()
{
bool balance;
string str;
cin>>str;
balance=isbalance(str);
if(balance)
cout<<"匹配"<<endl;
else
cout<<"不匹配"<<endl;
return 0;
}