社区
数据结构与算法
帖子详情
求救,求救,关于复杂的括号匹配问题!哪位仁兄可以解决啊!
Linux2001
2002-12-24 01:50:15
现在有一行字符串,可能包含下面几种括号[],<>,()现在问题是必须保证字符串中左括号和右括号出现次数相同(简单)但是必须保证出现的顺序正确,比如只能出现
[<()>]这样的,而不能出现[<)>(]这样的情况或者是<[)]>(这样类似的情况,如何写代码啊
...全文
140
20
打赏
收藏
求救,求救,关于复杂的括号匹配问题!哪位仁兄可以解决啊!
现在有一行字符串,可能包含下面几种括号[],,()现在问题是必须保证字符串中左括号和右括号出现次数相同(简单)但是必须保证出现的顺序正确,比如只能出现 []这样的,而不能出现[(]这样的情况或者是(这样类似的情况,如何写代码啊
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Linux2001
2002-12-25
打赏
举报
回复
老大我的要求是一个种左括号不能被另一种右括号先关闭,才出现这个括号的右括号这样的情况
boodweb
2002-12-25
打赏
举报
回复
ft
三种括号按我的办法就设三个变量啊
林仪明
2002-12-25
打赏
举报
回复
或者,你再加个堆栈,每次遇到[时压入frag11,遇到(压入frag21,遇到<压入frag31,遇到>压入frag32,遇到)压入frag22,遇到]压入frag12,不过压入的条件是{frag11,frag12},{frag21,frag22},{frag31,frag32}.
思路与 LeeMaRS(小菜虎 - 我要DP!) 一致,不过 LeeMaRS(小菜虎 - 我要DP!) 的实现更简单!
Linux2001
2002-12-25
打赏
举报
回复
了解,收到,结贴
LeeMaRS
2002-12-25
打赏
举报
回复
我觉得这个没有什么难的呀...还是很简单的压栈弹栈操作, 只是遇到反括号弹栈的时候, 判断弹出的括号与遇到的反括号是否匹配, 不就可以了?....
boodweb
2002-12-25
打赏
举报
回复
see
那可以考虑加个条件:几个变量中先变成>0的必须比后变成>0的晚归零
ScottMeyergen
2002-12-25
打赏
举报
回复
表达式完全可以是[aabd<asdfj>(askfj>]的形式
:是指可以判断其的不正确
Linux2001
2002-12-25
打赏
举报
回复
比如说有这样的条件字符串
[aaa(bac<acdb>kkl)jfl]这样的情况属于正常情况,但是如果变成了这样的情况就不正确了[aaa(bac<acdb)kkl>jfl]因为右圆括号封闭了左尖括号就差不多这样的意思
boodweb
2002-12-25
打赏
举报
回复
不懂。。。
你能举个“符合你的要求,却不能通过我程序验证”或者“不符合你的要求,却被我的算法认为是正确”的例子来么?(有点饶口:))
CoolQ
2002-12-24
打赏
举报
回复
还是看看编译原理吧!!^_^
Linux2001
2002-12-24
打赏
举报
回复
我需要的表达式是[<()>]或者是<[()]>或者是(<[]>)类似这样的形式,你说可以满足[aabd<asdfj>(askfj>]这样不就出现了左右括号不匹配了吗,因为我这里没有VC,我用Delphi的,所以,无法试验你的代码,只能翻译。
ScottMeyergen
2002-12-24
打赏
举报
回复
表达式完全可以是[aabd<asdfj>(askfj>]的形式
ScottMeyergen
2002-12-24
打赏
举报
回复
我只是写了个示例,这个示例中已经处理了三种括号呀!
Linux2001
2002-12-24
打赏
举报
回复
楼上的大哥,可能是我没有说清楚,我的意思是现在有三种括号,每种都需要出现了左括号才可以出现右括号,而不是我简简单单举的那个例子,一种括号的代码我已经完全写出来没有问题了,现在唯一问题就是多个括号同时存在的时候,左右括号的匹配问题
ScottMeyergen
2002-12-24
打赏
举报
回复
这是一个极其简单的实现,只能判断正误。
建议参考《数据结构C++语言描述》中的表达式求值(或The art of computor programming)
#include "stdafx.h"
#include <stack>
#include <iostream>
#include <string>
using namespace std;
char getContrast(char ch)
{
if(ch==']')
return '[';
if(ch=='[')
return ']';
if(ch=='(')
return ')';
if(ch==')')
return '(';
if(ch=='<')
return '>';
if(ch=='>')
return '<';
}
int main()
{
std::stack<char> expression;
string str("<[)]>(");
for(size_t sz=0;sz<str.length();sz++){
if(str[sz]=='['||str[sz]=='('||str[sz]=='<')
expression.push(str[sz]);
else if(str[sz]==']'||str[sz]==')'||str[sz]=='>'){
char top=expression.top();
if(str[sz]!=getContrast(top)){
std::cout<<str[sz]<<"不匹配"<<endl;
break;
}
else {
expression.pop();
}
}
}
if(!expression.empty()){
std::cout<<"匹配有误"<<endl;
}
else
std::cout<<"Ok !!"<<endl;
}
zhaofei
2002-12-24
打赏
举报
回复
堆栈中有个例子,是利用堆栈解决斯则四则混合运算问题,先确定各种括号的入栈优先级,再确定入栈规则,和出栈规则,现在必须保证字符串遍历后栈是空的。
boodweb
2002-12-24
打赏
举报
回复
我用'()'做例子说一下:
一个int s记录出现的括号次数,遇到'('则s++,遇到')'则s--
于是如果出现s<0的情形,则非法,出现')'前面没有'('与之匹配的情况;
如果扫描完还有s>0,则非法,存在'('没有匹配到
代码还不简单?一个循环就搞定了
zzwu
2002-12-24
打赏
举报
回复
1: 清stack;
2: 从左到右查表达式的么一个token;
3: 如为左括号,将此左括号push进stack;
4: 如为右括号,查stack是否空? 为空,说明右括号数目>左括号,指示出错,结束
5: 如果非空, 从stack中pop一个token出来,查它是否与此右括号类型匹配,不匹配,就指示出错,结束
6: 重复2-5,如能直到最后一个token不出错,则表示完全匹配,结束.
Linux2001
2002-12-24
打赏
举报
回复
我也是这样想的,但是具体代码还没有写出来,哪位大哥帮忙写一下吧
Riemann
2002-12-24
打赏
举报
回复
和一种括号情形一样,用一个堆栈就可实现
求救
有
哪位
仁兄
知道"杨辉三角"用c语言怎么编写出来。谢谢!
求救
——ssh数据插入的问题
今天很无奈,从早晨一直到现在花了6个小时了,但有个错误还是没
解决
。是这样的:struts+spring+hibernate,myeclipse+tomcat+mysql,我有两个表,一个是question,一个是answer,answer里有一个是foreign key,是qid...
大话西游系列之"期终考试"
大话西游之期终考试马上就要放假了,只剩下最后一关——期终考试。零声一响,学生们全副武装进入考场。 监考:让我们大家立刻开始这次期终考试吧! 学生:我们刚刚睡醒,经过外面... 生甲:这位
仁兄
,可不可以把卷
求救
啊
又面临着一个重大问题啊!数据库课设,现在是一点思路都没有啊。 题目如下: 建立一个员工请假管理系统, 编写应用程序完成系统开发。1. 建立基本表:员工的基本信息表:编号、姓名、上级员工编号、所在部门编号等...
Network Thread
怎样让控制台程序也能处理消息?到底这样可以吗?请高手指点。我在多线程中使用CSocket的,怎么老是出错,请大家帮我看看!VC中使用IXMLHTTPRequest获取URL...300分请教如何向DNS查询MX记录(SDK+socket)那位
仁兄
有在
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章