您的位置:首页 > 其它

栈的应用之括号的匹配

2017-11-21 23:09 232 查看
我们在学习了栈以后可以运用栈进行一些算法应用,比如对一个表达式进行括号匹配检测,具体可分为以下四种情况:

char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确

char b[] = "(()))abc{[]}"; // 右括号多于左括号

char c[] = "(()()abc{[]}"; // 左括号多于右括号

char d[] = "(())abc{[]()}"; // 左右括号匹配正确

我们的算法思想为遍历表达式,遇到左括号则进栈,遇到右括号则与栈顶元素相匹配,匹配成功则栈顶元素出栈。

#include<stack>
#include<iostream>
using namespace std;

bool IsBrackets(char* pStr)//判断是否为括号
{
if (*pStr == '(' || *pStr == ')' || *pStr == '[' ||
*pStr == ']' || *pStr == '{' || *pStr == '}')
return true;
else
return false;
}
bool MatchBrackets(char* pStr)//括号匹配
{
stack<char> s;//运用库里面的栈模板创建一个字符栈
size_t len = strlen(pStr);
for (size_t i = 0; i < len; ++i)//遍历字符串(表达式)
{
if (IsBrackets(&pStr[i]))
{
if (pStr[i] == '(' || pStr[i] == '[' || pStr[i] == '{')//如果是左括号入栈
{
s.push(pStr[i]);
}
else
{
if (s.empty())//如果是右括号,且栈为空,则说明栈里的左括号已经被匹配完
{
cout << "右括号多于左括号" << endl;
return false;
}
//如果栈顶元素与当前元素相匹配,则栈顶元素出栈
else if ((pStr[i] == ')' && s.top() == '(') || (pStr[i] == ']' && s.top() == '[') || (pStr[i] == '}' && s.top() == '{'))
{
s.pop();
}
else
{
cout << "左右括号匹配顺序错误" << endl;
return false;
}
}
}
/* else
{
continue;
}*/
}
//栈为空则说明表达式中左右括号匹配成功,负责左括号多于右括号
if (s.empty())
{
cout << "括号匹配正确" << endl;
return true;
}
else
{
cout << "左括号多于右括号" << endl;
return false;
}
}
int main()
{
char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确
char b[] = "(()))abc{[]}"; // 右括号多于左括号
char c[] = "(()()abc{[]}"; // 左括号多于右括号
char d[] = "(())abc{[]()}"; // 左右括号匹配正确
MatchBrackets(a);
MatchBrackets(b);
MatchBrackets(c);
MatchBrackets(d);
return 0;
}

以下为代码的运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: