您的位置:首页 > 其它

简单栈的应用之括号匹配

2017-12-13 21:19 393 查看

常常我们在写程序时,编译代码能发现我们括号匹配正确与否,今天我们模拟实现一个简单的括号匹配函数,用以复习栈的引用

#include<iostream>
#include<stack>
using namespace std;
bool is_Brackets(char ch)
{
if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}')
return true;
else return false;
}
bool is_left_Brackets(char ch)
{
if (ch == '(' || ch == '[' || ch == '{')
return true;
else return false;
}
int main(void)
{
char str[20];
char ch;
int i = 0;
scanf("%s",&str);
//cin >> str;
stack<char> sta;
while (str[i])
{
if (!is_Brackets(str[i]))
{
;
}
else
{
if (is_left_Brackets(str[i]))
{
sta.push(str[i]);
}
else
{
if (sta.empty())
{
printf("左括号缺少!!!");
return 0;
}
ch=sta.top();
switch (str[i])
{
case ')':
if (ch == '(')
{
sta.pop();
break;
}
else
{
printf("括号不匹配!!!");
return 0;
}
case ']':
if (ch == '[')
{
sta.pop();
break;
}

else
{
printf("括号不匹配!!!");
return 0;
}
case '}':
if (ch == '{')
{
sta.pop();
break;
}
else
{
printf("括号不匹配!!!");
return 0;
}
}
}
}
i++;
}
if (sta.empty())
printf("括号匹配!!!");
else printf("右括号缺少!!!");
return 0;
}


上面实现的有点水,下面实现一个优化过的版本(有百度过)

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

bool judge(const char *);
char getType(const char);
bool match(const char, const char);

int main()
{
cout << "输入待测序列:" << endl;
char seq[20];
cin >> seq;           //读取一个序列
cout << (judge(seq) ? "成功" : "失败") << endl;    //判断并输出结果
return 0;
}

//判断字符类型 左括号,右括号 或 其他
char getType(const char c)
{
char bracketSet[] = "([{}])";
int i;
for (i = 0; i < 6; i++)
{
if (bracketSet[i] == c) break;
}
if (i<3) return 'l';
else if (i < 6) return 'r';
else return 'n';
}

//判断是否为一对匹配的括号
bool match(const char cL, const char cR)
{
if (cL == '(')
return cR == ')' ? true : false;
else
return cR == cL + 2 ? true : false;
}

//判断序列是否括号匹配
bool judge(const char * str)
{
stack<char> S;      //新建一个栈
int i;
char bracketType;
for (i = 0; str[i] != '\0'; i++)
{
bracketType = getType(str[i]);      //判断是否为括号

if (bracketType == 'l')
{
S.push(str[i]);     //遇到左括号,入栈
}
else if (bracketType == 'r')
{
//遇到左括号,与栈顶比较,若匹配,栈释放顶层元素
if (match(S.top(), str[i])) S.pop();
//否则匹配失败,结束函数
else return false;
}
}
//判断栈内是否还有左括号,若无,则匹配成功
if (S.empty()) return true;
else return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: