括号匹配_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;
}
运行截图:
本文如有错误,请及时私信我。
原版要求:
如果给你一个字符串,它只包含下面的几个字符:’(‘、’)’、’{‘、’}
’、’[’、‘]’,你需要判断输入的字符串是否是一个有效的圆括号字符串。例如“((([[]])))”是有效的,但是“{}”和“((”则不是。
提示:根据经验,必须选用一种最合适的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;
}
运行截图:
相关文章推荐
- 运用单链表实现链栈,并实现括号匹配---作业
- 使用栈实现括号匹配算法-java
- 20155311高梓云的第三周作业
- 模拟 --- 简单括号匹配
- 栈应用--括号匹配的检验
- (容器配接器)堆栈应用:判断表达式中的括号是否匹配
- 栈和队列应用之括号匹配
- Java-利用栈实现括号匹配
- 括号匹配(二)
- 栈的应用:括号匹配
- 数据结构实验之栈四:括号匹配 字符串匹配
- 验证花括号是否匹配
- poj 2955 区间dp 最大括号匹配数
- 数据结构实验之栈四:括号匹配(java实现)
- 栈的应用----括号匹配、逆波兰表达式【数据结构】
- 51nod 1478 括号序列的最长合法子段(栈-括号匹配寻找最长合法子串长度及其个数)
- 添加最少括号匹配给定括号字符串
- 数据结构之括号匹配
- Coursera 吴恩达 Deep Learning 第二课 改善神经网络 Improving Deep Neural Networks 第三周 编程作业代码 Tensorflow Tutorial
- 数据结构——括号匹配