| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1307 人关注过本帖
标题:有兴趣的可以研究一下这题
只看楼主 加入收藏
wengjinxin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-7-17
收藏
 问题点数:0 回复次数:13 
有兴趣的可以研究一下这题

键盘输入一个含有括号的四则运算表达式,可能含有多余的括号,编程整理该表达式,去掉多余的括号,原表达式中所有的变量和运算符相对位置不变,并保持与原表达式等价。

例:输入表达式 应输出表达式
a+(b+c) a+b+c

(a*b)+c/d a*b+c/d

a+b/(c-d) a+b/(c-d)

注意输入a+b不能输出b+a.
表达式以字符串输入,长度不超过255。输入不要判错。
所有变量为单个小写字母。只是要求去掉所有多余的括号,不要对表达式化简。

搜索更多相关主题的帖子: Times New 兴趣 
2007-07-28 12:49
jackys2006
Rank: 1
等 级:新手上路
帖 子:195
专家分:0
注 册:2006-3-10
收藏
得分:0 
这个有点难度,要智能判断括号是不是多余的,
这个判断该如何进行?
要是表达式足够复杂,那判断是不是也应该足够智能化?

2007-07-28 16:50
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
基本算法:
搜索,
遇到乘则在其前的数字前去括号,其后的数字后去括号;否则不变.

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-07-28 20:48
星星鱼虾蟹
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-6-2
收藏
得分:0 

#include <stdio.h>
#define MAX 255
int main()
{
char c[MAX],temp;
int i,j,sign=-1,left=0,right=0;
do
{
scanf("%s",c);
for(i=0;c[i]!='\0';i++)
{
if(i==0&&c[i]!='-')
sign=0;
if(c[i]=='+')
sign=1;
if((sign==1||sign==0)&&c[i+sign]=='(')
{
left++;

for(j=i+sign+1;c[j]!='\0';j++)
{
if(c[j]=='(')
left++;
if(c[j]==')')
right++;
if(left==right)
break;
}
if(c[j+1]=='\0'||c[j+1]!='/'&&c[j+1]!='*')
{
c[i+sign]='0';
c[j]='0';
}
}
sign=-1;
left=right=0;
}
for(i=0;c[i]!='\0';i++)
{
if(c[i]!='0')
printf("%c",c[i]);
}
printf("\n");
printf("Input q/Q to exit!!\n");
}while((temp=getch())!='q'&&temp!='Q');
return 0;
}


2007-07-28 21:48
wengjinxin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-7-17
收藏
得分:0 
回4楼
你的思维能力应该很强吧
一个函数搞定,佩服
2007-07-29 00:29
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
回复:(星星鱼虾蟹)#include #defin...
a+((b+c)+e)
对这个输入,输出是错的
2007-07-29 01:11
wengjinxin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-7-17
收藏
得分:0 

回6楼
不错,其实这个问题是一个递归问题,上面那个程序只实现了去掉最外面的括号而没有去掉内部的括号,
只要利用上面那个程序做为递归函数,再加上递归结束条件,就能实现该问题了

2007-07-29 01:58
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
再给一个思想:
用计算表达式的方法,用两个栈,将表达式导入,然后再从栈中导出

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-07-29 08:50
星星鱼虾蟹
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-6-2
收藏
得分:0 
回复:(leeco)回复:(星星鱼虾蟹)#include #defin...

版主真强啊,这也把错找了出来.这是我修改过的,可能还有问题,还请指出~~
#include <stdio.h>
#define MAX 255
int main()
{
char c[MAX],temp;
int i,j,sign=-1,left=0,right=0;
do
{
scanf("%s",c);
for(i=0;c[i]!='\0';i++)
{
if(i==0&&c[i]!='-'||c[i]=='('&&i-1>=0&&(c[i-1]=='0'||c[i-1]=='('))
sign=0;
if(c[i]=='+')
sign=1;
if((sign==1||sign==0)&&c[i+sign]=='(')
{
left++;

for(j=i+sign+1;c[j]!='\0';j++)
{
if(c[j]=='(')
left++;
if(c[j]==')')
right++;
if(left==right)
break;
}
if(c[j+1]=='\0'||c[j+1]!='/'&&c[j+1]!='*')
{
c[i+sign]='0';
c[j]='0';
}
}
sign=-1;
left=right=0;
}
for(i=0;c[i]!='\0';i++)
{
if(c[i]!='0')
printf("%c",c[i]);
}
printf("\n");
printf("Input q/Q to exit!!\n");
}while((temp=getch())!='q'&&temp!='Q');
return 0;
}


2007-07-29 09:45
星星鱼虾蟹
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-6-2
收藏
得分:0 
回复:(wengjinxin)回6楼不错,其实这个问题是一个递...
其实不至于要用到递归啦.现在做的只是去多余括号,用一个函数就可以了.而我那个是写得有点问题,所以对于内层括号的去除实现不了...

2007-07-29 09:53
快速回复:有兴趣的可以研究一下这题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.078402 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved