请求高手援救,算法。

RiweiChen 2011-04-04 09:18:28
有如下规定
1,()是个合法表达式。
2,如果S是合法表达式,则(S)也是个合法表达式。
3,如果A和B都是合法表达式,则AB也是合法表达式。
4,其他的表达式都不是合法表达式
给你一个包含“(”和“)”的表达式,中间可能有多个合法表达式(只对满足规定的最长表达式进行计数,如“(())”和“()()” 都只算一个,不是两个),那这些合法表达式有多少个呢?
★数据输入
输入为一个长度不超过1000的包含“(”和“)”的非空字符串。
★数据输出
输出合法表达式的个数。
输入示例

()(()(()(()
输出示例
4
...全文
209 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2011-04-06
  • 打赏
  • 举报
回复
试一个
static int32 brackets(char *values)
{
int32 counts[1000 / 3 + 2];
memset(counts, 0, sizeof(int32) * (1000 / 3 + 2));
int32 value = 0, left = 0, index = 0, right = 0;
counts[0] = -1;
for(char next = *values; next != 0; next = *++values)
{
if((next &= 1) == 0)
{
if(right == 1)
{
while(counts[index] >= left) --index;
counts[++index] = left;
}
++left;
right = 0;
}
else if(--left > 0) right = 1;
else if(left == 0)
{
index = 1;
right = 0;
counts[1] = 0;
}
else
{
value += index;
left = index = 0;
}
}
if(right == 1)
{
while(counts[index] >= left) --index;
++index;
}
return value + index;
}
Ulfsaar 2011-04-06
  • 打赏
  • 举报
回复
5楼的结果是对的
hanfengzhongdexiyu 2011-04-06
  • 打赏
  • 举报
回复
#include <stdio.h>

char string[1001];
char *p = string;

int function(bool &flag, int *p_sum )
{

int count = 0;
int c = 0;
//进入函数的时候p 一定是指向 '('
while( '(' == *p )
{
++p;

if( '(' == *p )
{
c = function( flag, p_sum );
if ( c !=0 && !flag )
{
++( *p_sum );
}
}

if( ')' == *p )
{
++count;
//*p_sum += count;
++p;
}

if( 0 == *p && flag )
{
flag = false;
}
}

return count;
}

int main()
{
printf("输入表达式: ");
scanf("%s", string);
int sum = 0;
int count = 0;
bool flag = true;

while ( 0 != *p )
{
while ( '(' != *p && 0 != *p )
{
++p;
}
if( 0 != *p )
{
count = function( flag, &sum );
if( count != 0 )
{
++sum;
}
}
}


printf("\t%d\n", sum );

return 0;
}
showjim 2011-04-06
  • 打赏
  • 举报
回复
memset(counts, 0, sizeof(int32) * (1000 / 3 + 2));

这一行没有用,可以删除
RiweiChen 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hanfengzhongdexiyu 的回复:]
#include <stdio.h>

char string[1001];
char *p = string;

void function( int *p_sum )
{
int count = 0;
//进入函数的时候p 一定是指向 '('
while( '(' == *p )
{
++p;

if( '(' == *p )
……
[/Quote]
回复三楼,首先谢谢你的代码,但遗憾的是,没有符合题目的要求,你的代码能够处理示例输入输出,但还有很多情况没有考虑到,比如:对于(()()((()))((()()))))等类似的输入没有按要求得到结果的。还比如:()))()()().按要求应该为2吧。还是很感谢你的。thanks.
hanfengzhongdexiyu 2011-04-05
  • 打赏
  • 举报
回复
#include <stdio.h>

char string[1001];
char *p = string;

void function( int *p_sum )
{
int count = 0;
//进入函数的时候p 一定是指向 '('
while( '(' == *p )
{
++p;

if( '(' == *p )
{
function( p_sum );
}

if( ')' == *p )
{
++count;
*p_sum += count;
++p;
}

if( 0 == *p )
{
;
}
}

}

int main()
{
printf("输入表达式: ");
scanf("%s", string);
int sum = 0;
int count = 0;

while ( 0 != *p )
{
while ( '(' != *p && 0 != *p )
{
++p;
count = 0;
}
if( 0 != *p )
{
function( &sum );
}
}


printf("\t%d\n", sum );

return 0;
}
RiweiChen 2011-04-04
  • 打赏
  • 举报
回复
恩,这个是我们算法的题目,去年我们学离散貌似也没有这个,对于这个问题有几个迷糊的地方:1.对于((()))算一个怎么去统计;2.((()()()))之类的统计。总之不明不白的,这个是我们堆栈的题目,我的想法是把左括号入栈,当堆栈不为空且下一个是右括号时,出栈。但是在这里我不知道怎么去计数,因为好像有很多的情况只能算是一个,到底是什么时候能确定计算一个结束了?希望高手能给我指点思路,不胜感激。
無_1024 2011-04-04
  • 打赏
  • 举报
回复
离散数学的题目 很熟悉 不过不想写了 当年可是写了很长的一段时间 自己好好写吧 判断表达式合法性 在百度里面搜把

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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