社区
数据结构与算法
帖子详情
如何用“递归”的方法判断一个字符串中的括号是否匹配??
pcbit
2006-12-11 08:58:45
设有算术表达式,其中包含有大括号“{ "" }" 中括号"[" "]" 小括号 "(" ")"
试编写一个递归函数,判断表达式中的括号是否匹配?
谢谢
...全文
5151
45
打赏
收藏
如何用“递归”的方法判断一个字符串中的括号是否匹配??
设有算术表达式,其中包含有大括号“{ "" }" 中括号"[" "]" 小括号 "(" ")" 试编写一个递归函数,判断表达式中的括号是否匹配? 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)
这个时候,可以把括号
中
一组字符,看作
一个
整体了。 分组模式举例说明 如:查找
字符串
中
,连续出现多个win
字符串
的字符。可以这样完 <?php $str = "this is win winwindows!"; preg_match_all("/(win)+/",$str,$...
200个经典C程序【源码】
031
判断
字符串
是否回文 032 通讯录的输入输出 033 扑克牌的结构表示 034 用“结构”统计学生成绩 035 报数游戏 036 模拟社会关系 037 统计文件的字符数 038 同时显示两个文件的内容 039 简单的文本编辑器 ...
leetcode
中
国-leetcode:leetcode刷题
用栈
判断
括号匹配 Regular Expression Matching
递归
匹配 wildcard matching 动态规划 longest common prefix , 简单 valid number, hard, 用有限自动机 integer to roman ,easy , 模拟 roman to integer ,easy , ...
数据结构2023考研第三章第三节站和队列的应用代码+批注C++
1.
中
缀表达式转化为前缀,后缀表达式 2. 后缀表达式求值 3. 括号匹配 4. 使用栈排序
字符串
5. 使用栈实现
递归
的非
递归
计算 6. 模拟渡口管理 有任何问题或错误 3030949391@qq.com
判断
字符串
中
的
括号是否匹配
题目:给你
一个
字符串
,
判断
字符串
中
的
括号是否匹配
,意思就是
一个
左括号要对应
一个
右括号,即'('和')'必须成对出现。那不就是
判断
字符串
里面的'('和')'数量是不是相等吗,这个简单呀,用stl算法里面的count()...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章