社区
数据结构与算法
帖子详情
如何用“递归”的方法判断一个字符串中的括号是否匹配??
pcbit
2006-12-11 08:58:45
设有算术表达式,其中包含有大括号“{ "" }" 中括号"[" "]" 小括号 "(" ")"
试编写一个递归函数,判断表达式中的括号是否匹配?
谢谢
...全文
5193
45
打赏
收藏
如何用“递归”的方法判断一个字符串中的括号是否匹配??
设有算术表达式,其中包含有大括号“{ "" }" 中括号"[" "]" 小括号 "(" ")" 试编写一个递归函数,判断表达式中的括号是否匹配? 谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
45 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ghjvavi
2006-12-15
打赏
举报
回复
mark
treeroot
2006-12-15
打赏
举报
回复
地方萨发生
的;;fkjdsajfkjdkl;fjals;djfklas范德萨发生法
hs119110
2006-12-14
打赏
举报
回复
好久没用C,差不多不会写了,下面是个用java写的程序。
public class Test{
public static void main(String[] args) {
//测试用字符串
String st = "asdfd{adf{sd}(dd)[}adsf]sdf({})";
//使用正则表达式,将所有非()[]{}字符替换为空,相当于删除
st = st.replaceAll("[^\\(\\)\\{\\}\\[\\]]","");
//判断是否包含成对出现的()[]{}
while(st.indexOf("[]")>=0 || st.indexOf("()")>=0 || st.indexOf("{}")>=0){
//如果有,则用正则表达式将成对出现的()[]{}替换为空
st = st.replaceAll("\\[\\]|\\(\\)|\\{\\}","");
}
//输出判断结果,长度为0代表所有括号均为成对出现
System.out.println(st.length() == 0);
}
}
xuancaoer
2006-12-14
打赏
举报
回复
mark
LANXUEFEI
2006-12-14
打赏
举报
回复
mark
熊孩子开学喽
2006-12-14
打赏
举报
回复
既然没有时间看编译原理,那就只能用字符串查找来判断,看一个字符串中的"{"和"}"相等就可以了
peterdoo
2006-12-14
打赏
举报
回复
mark
hardmy
2006-12-14
打赏
举报
回复
进栈,出栈
hcw_peter
2006-12-14
打赏
举报
回复
xhute(AAA),
搞的那么复杂干吗!
为大,中,小括号各设一个变量,初始为0
读串,遇左括号加一,右减一
满足以下两个条件匹配:
1,过程中,每个变量大于等于0
2,最后都归0。
------------------------------------------------
這個只能判斷非常簡單的問題!真不明白這個也能得獎,一句話‘不實用’;
如果要判斷非常復雜的SQL語句就肯定不行!
我以前也做過類似的問題(當時是用存儲過程寫的)
1、先紀錄下各個符號的位置
2、再做相應的匹配處理
3、再根據匹配的方法分解SQL語句
flyingsnowy
2006-12-14
打赏
举报
回复
来晚鸟。木由分。
flyingsnowy
2006-12-14
打赏
举报
回复
typedef char StackEntry;
int Check( )
{
STACK S; //定义栈结构S
char ch;
InitStack(&S); //初始化栈S
while ((ch=getchar())!=’\n’) {
//以字符序列的形式输入表达式
switch (ch) {
case (ch==‘(’||ch== ‘[’||ch== ‘{’): Push(&S,ch);break; //遇左括号入栈
//在遇到右括号时,分别检测匹配情况
case (ch== ‘)’): if (StackEmpty(S)) retrun FALSE;
else {Pop(&S,&ch);
if (ch!= ‘(’) return FALSE; }
break;
case (ch== ‘]’): if (StackEmpty(S)) retrun FALSE;
else {Pop(&S,&ch);
if (ch!= ‘[’) return FALSE; }
break;
case (ch== ‘}’): if (StackEmpty(S)) retrun FALSE;
else {Pop(&S,&ch);
if (ch!= ‘{’) return FALSE; }
break;
default:break;
}
}
if (StackEmpty(S)) return TRUE;
else return FALSE;
}
deerchao
2006-12-14
打赏
举报
回复
请看鄙人的<< 正则表达式30分钟入门教程(第二版)>>(http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm)里关于"平衡组"的介绍.
说明:适用于.net framework. 不过其它环境下的Regex实现好像也有支持平衡组的,不过语法不同.
my_infinity
2006-12-14
打赏
举报
回复
mark
亮灯了
2006-12-14
打赏
举报
回复
不错,学习!
qking93415981
2006-12-14
打赏
举报
回复
最简单的方法,使用正则表达式
以下正则表达式可以找出字符串中{}匹配的子串:
\{(?>[^\{\}]+|\{(?<DEPTH>)|\}(?<-DEPTH>))*(?(DEPTH)(?!))\}
如果剩余串中还有{ or }则说明不匹配。
(在.net下测试可行)
要匹配()[]只需将{}替换即可。
mwp
2006-12-14
打赏
举报
回复
后进先出堆栈,遇到“(”时进栈,“)”时出栈,如果到最后栈空了就匹配了,否则。。。
Richard_Hong
2006-12-14
打赏
举报
回复
biqiweish()说的有道理
biqiweish
2006-12-14
打赏
举报
回复
检查表达式括号匹配问题
注:文中的“位置不存在”指按指定的规则没有搜索到目标,通常编程中用特殊数值表示该情况,以区分正常的位置数值。
递归方案
处理STEP如下:
1. 从左至右搜索第一次出现的“(,[,{”,记为位置1。
2. 从右至左搜索第一次出现的“),],}”,记为位置2。
3. 如果位置1和位置2都不存在,则返回OK。
4. 如果位置1和位置2只有一个存在,则返回ERROR。
5. 如果位置1>位置2,则返回ERROR。
6. 如果位置1和位置2对应的左右括号不配对,则返回ERROR。
7. 递归处理位置1和位置2包围的中间字符串。
非递归方案(堆栈方案)
处理STEP如下:
1. 记位置1为0,初始化堆栈为空。
2. 从表达式位置1开始向右搜索“(,),[,],{,}”,记为位置1。
3. 如果位置1不存在,且堆栈为空,则返回OK。
4. 如果位置1不存在,且堆栈不为空,则返回ERROR。
5. 如果位置1是“(,[,{”,则将位置1的括号压入堆栈,goto Step2。
6. 如果位置1是“),],}”,则从堆栈弹出括号。
7. 如果堆栈弹出失败(堆栈为空),则返回ERROR。
8. 如果弹出括号和位置1的括号不配对,则返回ERROR。
9. 位置1加1,Goto Step2。
有问题请各位指正,共同学习,谢谢。
个人认为程序用什么写不重要,重要的是解决问题的方案。
barry301
2006-12-14
打赏
举报
回复
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
typedef string::size_type spos;
spos minpos(spos sp1,spos sp2,spos sp3)//这里写的不好
{
string::size_type ipos1=string::npos-sp1,ipos2=string::npos-sp2,ipos3=string::npos-sp3;
return string::npos-((ipos1>ipos2?ipos1:ipos2)>ipos3?(ipos1>ipos2?ipos1:ipos2):ipos3);
}
int is_match(string str) //-1表示不匹配,0表示匹配
{
string::size_type ipos1,ipos2,ipos3,ircal,ilcal;
char s;
ipos1=str.find_first_of('}');
ipos2=str.find_first_of(']');
ipos3=str.find_first_of(')');
ircal=minpos(ipos1,ipos2,ipos3);//找位置最左边的先处理
if (ircal==ipos1) s='{';
else if (ircal==ipos2) s='[';
else if (ircal==ipos3) s='(';
ilcal = str.find_first_of(s);
if ((ilcal==string::npos)&&(ircal!=string::npos))
return -1;
else
if ((ilcal!=string::npos)&&(ircal==string::npos))
return -1;
else
if ((ilcal==string::npos)&&(ircal==string::npos))
return 0;
else
if (ilcal>ircal) return -1;
else
{
str.erase(ilcal,ircal-ilcal+1);
//cout <<str<<endl;
return is_match(str);
}
}
void main ()
{
string s;
cin>>s;
cout<<is_match(s);
}
以上只能判断括号匹配问题,对于字符串中含有+)之类的就无能为力了!
redhat456
2006-12-13
打赏
举报
回复
数据结构的时候用栈的先进后出机制实现的!
加载更多回复(25)
java
字符串
处理取出括号内的
字符串
下面是
一个
简单的示例,展示了如何使用正则表达式从
字符串
中
提取括号内的内容: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String...
括号匹配.cpp
在代码
中
,通常需要定义
一个
函数来
判断
一个
给定的
字符串
是否符合括号匹配的规则。这个函数可能需要处理各种输入情况,包括异常输入,并返回相应的布尔值或错误信息。如果
字符串
中
括号不匹配或存在其他问题,则函数...
数据结构的括号匹配问题代码
在编程领域,括号匹配通常用于检查
一个
字符串
中
的括号是否正确配对,例如在数学表达式、XML或JSON格式的解析
中
。这个问题在软件开发
中
具有重要的实际应用价值。 首先,我们需要理解什么是栈。栈是一种后进先出...
C语言 不使用栈进行括号匹配
在编程领域,括号匹配是一项基础且重要的任务,主要用于检查
字符串
中
的括号是否按照正确的顺序出现,例如在表达式解析、代码语法分析等场景。在C语言
中
,我们通常使用数据结构,特别是栈来解决这个问题。然而,"不...
kuohaopipei.rar_visual c_括号匹配 _括号匹配程序
首先,括号匹配的基本思想是检查
一个
字符串
中
的左右括号是否成对出现,例如,"( )", "[ ]", "{ }"。正确的匹配意味着每个左括号都有相应的右括号与之对应,并且它们之间的嵌套关系正确。错误的匹配则表示存在没有...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章