题意如图:
给出一个字符串检验括号是否相匹配。
脑海里一个直接的想法就是我们计算左括号和右括号的总数,比较两个总数。
但是:
这样的也满足上面的条件,所以这个思路行不通
除此之外,我们还要考虑每个左括号必须在它右边找到对应的右括号。
也就是:任何右括号应该对应离他最近的左括号。
思路:从左向右扫描表达式,记录所有未关闭的括号,每当我们碰到一个左括号,我们就把他加到列表中,每当我们碰到一个右括号,他应该对应列表里最后一个左括号。如果不一致,说明括号不匹配,或者如果列表为空,也说明括号不匹配。
什么容器刚好能实现这样的思路呢.明显是栈。
代码实现:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool pipei(char c[],int n)
{
stack<char> S;
int i;
for (i = 0;i < n;i++)//遍历表达式
{
if (c[i] == '(' || c[i] == '[' || c[i] == '{')//左括号
{
S.push(c[i]);//压入栈
}
else if (c[i] == ')' || c[i] == ']' || c[i] == '}')//右括号
{
if (S.empty())//判断栈是否为空
return false;//栈空
else//栈非空
{
if (c[i] == ')' && S.top() == '(')//和栈顶元素匹配就把栈顶元素删除
S.pop();
if (c[i] == ']' && S.top() == '[')
S.pop();
if (c[i] == '}' && S.top() == '{')
S.pop();
}
return S.empty() ? true : false;//最后判断栈是否为空
}
}
}
int main()
{
char c[1000];
cin >> c;
bool ret = pipei(c, strlen(c));
if (ret)
cout << "Matching!";
else
cout << "No matching!";
}