用C语言实现一个简单的算法

瀚度 2012-08-03 08:54:45
括号匹配,怎么做啊,包括小括号和中括号,但最外层必须是一个括号,里面只要符合括号规则就行,然后判定。。
如输入:
3
()()
([][])
([)])
输出:
no
yes
no
...全文
210 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2012-08-03
  • 打赏
  • 举报
回复
基本上就是栈的应用了。
mLee79 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

1楼方法可以。
另外请参考《编译原理》词法分析 有限状态自动机
[/Quote]

括号匹配是2型文法, 不能用有穷自动机描述.
用个简单的栈就可以了, 遇左括号压栈, 右括号出栈并比较是否匹配即可...
赵4老师 2012-08-03
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
酱油党 2012-08-03
  • 打赏
  • 举报
回复
这个就是超级简化版的编译原理吗
赵4老师 2012-08-03
  • 打赏
  • 举报
回复
1楼方法可以。
另外请参考《编译原理》词法分析 有限状态自动机
lx3275852 2012-08-03
  • 打赏
  • 举报
回复
试着写了一下,挺有趣的,暂时没考虑全角括号~

#include <stdio.h>
/*
递归函数
参数:字符数组指针
返回值:返回括号合格括号的层数
ex: () 返回1, [[]]返回2
*/
int digui( char *p )
{
int r = 0; //当前括号层数总计数
char sign = 0; //对应的括号符号
switch( *p++ )
{
case '(': sign = ')'; break;
case '[': sign = ']'; break;
//case '{': sign = '}'; break;
default: return 0; //不是以前括号开头则返回
}
while( *p != sign )
{
int re; //递归返回值
re = digui( p );
if ( re == 0 ) return 0;
p += re * 2; //跳过括号层数
r += re;
}
return ( r + 1 );

}
/*主函数*/
int main()
{
char s[5][64] = { "()()", "([][])", "([)])", "([(()()())]([]()))", "([[]]]())" };
int i;
for( i = 0; i < 5; ++i )
{
int r = digui(s[i]);
if( r == 0 || s[i][r*2] != '\0' ) printf( "no\n" );
else printf( "yes\n" );
}
return 0;
}
AnYidan 2012-08-03
  • 打赏
  • 举报
回复
小括号和中括号 各用一个变量表示,初值 = 0, 见 ( [, + 1; 见 )], -1, 看最后是否为 0
AnYidan 2012-08-03
  • 打赏
  • 举报
回复
小括号和中括号 各用一个变量表示,初值 = 0, 见 ( [, + 1; 见 )], -1, 看最后是否为 0
s030903012 2012-08-03
  • 打赏
  • 举报
回复
用栈处理。
如:
输入n个字符,先将第一个字符压栈,其后每个字符看是否与栈顶元素匹配,若匹配,栈顶元素出栈,不匹配则将这个元素压栈,处理完n-1个元素之前,堆栈不能为空,为空说明第一个元素已经被匹配了,最外层不是括号,若只在处理完最后一个元素后堆栈为空,则括号完全匹配且最外层为括号,若最后堆栈不为空,则括号不完全匹配。
lx3275852 2012-08-03
  • 打赏
  • 举报
回复
递归吧。。。
递归函数里,循环判断 只要碰到 ( 或者 [ 就继续递归~
碰到) ] 就跳出本层函数

main里边调用递归函数,只调用一次(这样就能判断最外层是不是有一层括号)~
modicum_lf 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 6 楼 的回复:

1楼方法可以。
另外请参考《编译原理》词法分析 有限状态自动机


括号匹配是2型文法, 不能用有穷自动机描述.
用个简单的栈就可以了, 遇左括号压栈, 右括号出栈并比较是否匹配即可...
[/Quote]

++

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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