栈的应用之括号的匹配
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;
}
以下为代码的运行结果:
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;
}
以下为代码的运行结果:
相关文章推荐
- 数据冒险之栈应用(数制转换、括号匹配)
- 算法——括号匹配问题(堆栈应用)
- 数据结构复习_栈和队列,应用_括号匹配&文件目录递归拷贝,
- 栈的简单应用(数制转换、括号匹配检验、行编辑、迷宫求解)
- 学习笔记------数据结构(C语言版)栈应用 括号匹配
- 数据结构——顺序栈及其应用(括号匹配)
- 栈应用--括号匹配的检验
- 栈的应用(括号匹配)
- 数据结构-C语言 栈的简单应用——括号匹配
- 栈的应用之判断括号匹配
- 栈的应用举例:括号的匹配
- 多括号匹配——栈的应用
- 5.栈的应用-数制转换和括号匹配
- 栈的应用--括号匹配的检验
- 栈的应用1:数制转换、括号匹配检验和行编辑程序
- c++STL的stack的应用之括号匹配
- 括号匹配 栈的应用
- 20.Valid Parentheses 栈的应用:括号匹配
- 2. 栈的两个应用:括号匹配和表达式的计算。
- 栈的应用之括号匹配