如何用“递归”的方法判断一个字符串中的括号是否匹配??

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)

33,008

社区成员

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

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