您的位置:首页 > 理论基础 > 数据结构算法

括号匹配_boolan(博览网)_第三门课_第三周_作业

2017-06-08 22:53 267 查看
喜欢的朋友可以关注收藏一下:  http://blog.csdn.NET/qq_31201973

本文如有错误,请及时私信我。

原版要求:

如果给你一个字符串,它只包含下面的几个字符:’(‘、’)’、’{‘、’}
’、’[’、‘]’,你需要判断输入的字符串是否是一个有效的圆括号字符串。例如“((([[]])))”是有效的,但是“{}”和“((”则不是。

提示:根据经验,必须选用一种最合适的STL容器来完成该题,必须写上测试代码。

解题分析:比较明显的是,为了判断有效,我们必须从头扫描整个字符串,问题在于我们不能立即判断,因为当前节点依赖后续节点,因此我们需要将栈作为辅助工具。

具体操作为:如果是左括号入栈,直到读到所依赖的右括号,再从栈中弹出该节点,如果当前节点是右括号,则栈顶必须是相依赖的左括号,否则输入无效。当扫描完全部,栈应该为空,否则无效。

    假设在表达式中,([]())或[([ ][ ])],等为正确的格式,[( ])或([( ))或 (()]) 均为不正确的格式。

则 检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。

例如:考虑下列括号序列:

[ ( [ ] [
] ) ]

1 2 3 4 5
6 7 8

分析可能出现的不匹配的情况:

•到来的右括弧并非是所“期待”的;

•到来的是“不速之客”;

•直到结束,也没有到来所“期待”的括弧。

算法的设计思想:

1.凡是出现左括弧,则进栈。

2.凡是出现右括弧,首先检查栈是否为空,若为空,则表明右括号是多余的。否则与栈顶元素比较,若相配左括号出栈,否则表明不相配。

3.表达式检验结束时,若栈空则表明表达式中匹配正确,否则则表明左括号多余,表示不相配。

伪算法:



这个算法主要采取了栈的方式,之前采取了stack+string的模式,结果stack的push抽了,只能传地址,导致出现越界问题。

越界就导致判断的不匹配,所以我用char*+stack的结果,并且定义一个char截取除了首元素的部分,使其匹配。

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<stack>
#include<cstring>

using namespace std;
const int OK = 1;
const int NO = 0;

int Parentheses_matching_detection(char* s)
{
stack<char> sta;
char s1;
int i = 0;
int state = 1; //1为合法 0为不合法
while ((i < strlen(s)) && state)
{
switch (s[i])
{
case '(':
{
sta.push(s[i]);
++i;
break;
}
case ')':
{
s1 = sta.to
a4c7
p();
if ((!sta.empty()) && (s1 == '('))
{
sta.pop();
++i;
break;
}
else
{
state = 0;
break;
}
}
case '(':
{
sta.push(s[i]);
++i;
break;
}
case ')':
{
s1 = sta.top();
if ((!sta.empty()) && (s1 == '('))
{
sta.pop();
++i;
break;
}
else
{
state = 0;
break;
}
}
case '{':
{
sta.push(s[i]);
++i;
break;
}
case '}':
{
s1 = sta.top();
if ((!sta.empty()) && (s1 == '{'))
{
sta.pop();
++i;
break;
}
else
{
state = 0;
break;
}
}
case '[':
{
sta.push(s[i]);
++i;
break;
}
case ']':
{
s1 = sta.top();
if ((!sta.empty()) && (s1 == '['))
{
sta.pop();
++i;
break;
}
else
{
state = 0;
break;
}
}
defaule:
{
++i;
break;
}
}
}
if (sta.empty() && state)
{
return OK;
}
else
{
return NO;
}
}

int main()
{
char a = 'a';
char *s = &a;

while (1)
{
cout << "请输入一组字符:";
gets(s);
if (Parentheses_matching_detection(s))
{
cout << "字符串中 无 不匹配的括号." << endl;
}
else
{
cout << "字符串中 有 不匹配的括号." << endl;
}
}

system("pause");
return 0;
}

运行截图:

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