括号匹配问题 C++实现
问题描述:
给定一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,请编写程序检查该字符串的括号是否成对出现。
输出:
Yes:代表括号成对出现并且嵌套正确。
No:未正确使用括号字符。
问题分析:
括号匹配问题是典型的数据结构“栈”应用问题。
栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。
栈的特性:后进先出(LIFO)
下面是截取自简书上的算法流程图:
代码实现(C++):
定义了一个judge()函数用来判断输入样例是否满足括号匹配原则,满足返回true,否则返回false。
如果说比较重要的,那我感觉还是在judge()函数中,一旦收到右括号我们就要和当前栈顶元素进行匹配。但是在这里我们要首先判断栈是否为空。比如下面这个情况:
()]
遇到上面的序列我们首先将“(”压栈,然后遇到“)”进行栈顶匹配,出栈。此时栈为空。继续扫描遇到 “]” ,如果没有判断栈是否为空的条件就会出现栈指针错误。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
/*
test:
4
[(d+f)*{}]
[(2+3)]
()}
[4(6]7)9
*/
bool judge(string s)
{
stack<char> stk;
for (int i = 0;i < s.length();i++)
{
switch (s[i])
{
case '(':stk.push(s[i]);break;
case '[':stk.push(s[i]);break;
case '{':stk.push(s[i]);break;
case ')':
if (stk.empty())
return false;
if (stk.top() == '(')
{
stk.pop();
}
else
{
return false;
}
break;
case ']':
if (stk.empty())
return false;
if (stk.top() == '[')
{
stk.pop();
}
else
{
return false;
}
break;
case '}':
if (stk.empty())
return false;
if (stk.top() == '{')
{
stk.pop();
}
else
{
return false;
}
break;
}
}
return stk.empty();
}
int main()
{
int n; //输入的样例数,例如4
while (cin >> n)
{
while (n--)
{
string s;
cin >> s;
if (judge(s))
cout << "Yes" << endl;
else cout << "No" << endl;
}
}
}
最后是输出结果:
最后罗嗦一下,我的程序设置的是无限循环情况,n代表样例数,就是说n=4,那么就必须有4组括号输入。