求救,求救,关于复杂的括号匹配问题!哪位仁兄可以解决啊!

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
  • 打赏
  • 举报
回复
和一种括号情形一样,用一个堆栈就可实现

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧