目录
括号匹配失败的几种情况:
1、左括号单身:匹配完成后栈内还存在左括号;
2、右括号单身:匹配完成后,栈空,右括号无与之匹配的左括号;
3、左右括号不匹配:右括号的栈顶不为与之匹配的左括号;
代码实现如下,可根据需要改定:
#include<bits/stdc++.h>
using namespace std;
/*stack<int> s;
stack< int, vector<int> > stk; //覆盖基础容器类型,使用vector实现stk
s.empty(); //判断stack是否为空,为空返回true,否则返回false
s.size(); //返回stack中元素的个数
s.pop(); //删除栈顶元素,但不返回其值
s.top(); //返回栈顶元素的值,但不删除此元素
s.push(item); //在栈顶压入新元素item
*/
int Match(stack<char> &ss,char Leftkuohao, int& flag)//括号匹配函数
{
if (!ss.empty() && ss.top() == Leftkuohao) //如果栈不为空且栈顶元素与右括号匹配
{
ss.pop(); //栈顶元素(右括号)出栈
flag--;
return 1;
}
else
{
//匹配失败
return 0;
}
}
int main()
{
string s; //括号串
stack<char> ss;
while (cin >> s)
{
int flag = 0; //匹配标志
for (char c : s) //遍历一次字符串
{
if (c == '(' || c == '{' || c == '[') //左括号进栈
{
ss.push(c);
flag++;
continue; //左括号进栈后跳出for循环,继续遍历字符串
}
if (c == ')')
{
if (Match(ss, '(', flag)==1)
continue;
else
break;
}
if (c == '}')
{
if (Match(ss, '{', flag)==1)
continue;
else
break;
}
if (c == ']')
{
if (Match(ss, '[', flag)==1)
continue;
else
break;
}
}
if (flag==0)
cout << "括号匹配成功!" << endl;
else
cout << "括号匹配失败!" << endl;
}
return 0;
}