一、括号匹配
二、算法步骤
使用栈进行,遇到左括号进栈,右括号检查栈顶元素是否匹配,然后出栈,最后栈为空则匹配成功。
对括号进行匹配的时候,可以将各种左括号映射为负数,对应的右括号映射为相反数,然后遍历一个字符串,将负数入栈,正数检查匹配性后,栈顶元素出栈,最后检查栈是否为空即可。
不考虑优先级的解法:
#include
#include
#include
using namespace std;
unordered_mapmp={ //使用map进行映射
{'{',-1},{'}',1},
{'[',-2},{']',2},
{'<',-3},{'>',3},
{'(',-4},{')',4},
};
bool check(string str)
{
stackstk;
for(auto c:str)
{
int t = mp[c];//获取当前括号是左括号还是右括号
if(t<0) {stk.push(t);}
else
{
if(stk.size() && stk.top()==-t) {stk.pop();}
else {return false;}
}
}
return stk.empty();
}
int main(){
string str;
cin>>str;
check(str)==true?cout<<"yes":cout<<"no";
return 0;
}
考虑优先级的做法:
假设优先级为:大括号->中括号->小括号->尖括号,且优先级的括号可以嵌套,即`{[()]},{(())},{{}}`是合法的。那么我们在元素入栈的时候需要比较栈顶元素的优先级,栈顶元素优先级>=当前元素,才可入栈。于是我们仍用map做映射,不过此时大括号数值最大,尖括号数值最小。
完整代码:
```cpp
unordered_map<char,int>mp = {
{'<',-4},{'>',4},
{'(',-3},{')',3},
{'[',-2},{']',2},
{'{',-1},{'}',1},
};
bool check(string str)
{
stack<int>stk;
for(auto c:str)
{
int t = mp[c];
if(t<0)
{
if(stk.empty()) {stk.push(t);} //首先栈为空左括号一定可以入栈
else
{
if(stk.top()>=t) {stk.push(t);} //如果不为空,需要检查栈顶元素的优先级
else {return false;}
}
}
else
{
if(stk.size()&&stk.top()==-t) {stk.pop();}//栈顶元素和右括号匹配且栈不为空才可出栈。
else {return false;}
}
}
return stk.empty();
}
int main()
{
string str;cin>>str;
check(str)==true?cout<<"YES"<<endl:cout<<"NO"<<endl;
return 0;
}