怎样求删除括号???

yougaocuo 2002-07-22 10:23:39
问题描述:
输入一个表达式,将其中不需要的括号删去。如:
输入:(a+b)+c
(a*b)+c/(d*e)
a+b/(c-d)
应输出:
a+b+c
a*b+c/(d*e)
a+b/(c-d)
该怎样编出来?(用c程序!)谢了!!



...全文
15 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xDraw 2002-07-26

int level(char ch)
{
int level = 0;
if((ch=='+')||(ch=='-'))
{
level = 1;
}
else if((ch=='*')||(ch=='/'))
{
level = 2;
}
/*
else if((ch>='a' && ch<='z')||(ch>='A' && ch<='B')||
(ch>='0' && ch<='9')||(ch=='(')||(ch==')'))
{
level = 0;
}
*/
return level;
}

void slim(char* s, char* d, int &sn, int &dn, int& l)
{
int i=0,j=0, lt=0, l1, l2, sn1, dn1, li, lo;
char ch;
ch = s[0];
while(ch)
{
d[j]=ch;
j++;
if(ch == ')')
{
j--;
d[j]=0;
break;
}
else if(ch == '(')
{
if(i!=0)
l1=level(s[i-1]);
else
l1=0;
slim(&s[i+1],&d[j],sn1,dn1,li);
if(s[i+sn1+2]!=0)
l2=level(s[i+sn1+2]);
else
l2=0;
lo=(l1>l2)?l1:l2;
if(li==0) li=1;
if(li>=lo) // slim
{
memcpy(&d[j-1],&d[j],dn1);
j+=(dn1-1);
d[j]=0;
}
else
{
d[j+dn1]=')';
j+=(dn1+1);
d[j]=0;
}
i+=(sn1+2);
ch=s[i];
}
else
{
if(level(ch)>0)
{
if(lt!=0)
lt=(level(ch)<lt)?level(ch):lt;
else
lt=level(ch);
}
i++;
ch=s[i];
}
}
l=lt;
sn=i;
dn=j;
}



void CTestDlg::OnButton3()
{
UpdateData();

if(m_strSrc == _T(""))
return;

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

char s[512];
char d[512];
memset(s,0,512);
memset(d,0,512);
strcpy(s,LPCTSTR(m_strSrc));
int sn,dn,l=0;
slim(s,d,sn,dn,l);

AfxMessageBox(d);
}
回复
zzwu 2002-07-25

这一问题除了牵涉运算符的优先级别外,还牵涉运算的可交换性,需要周到的分析,不过不会太繁. 先可一一考察,然后总结出一个规律. 举例说, 如

1. 在'+'号后的'('及其对应的')'总是多余的, 可以无条件删去,
2. 在'-'号后的一对( ), 则要查( )内的表达式是否因子, 是,可删,否则不,
3. 在'*'号后的( ), 同样要查( )内的表达式, 是因子,可删,
4. 在'/'号后的( ), 除非( )内是常量,变量,否则都不可删,

等等


回复
MrRight 2002-07-24
建议找编译原理书看,专门解决这些问题
回复
chenggn 2002-07-23
我知道. 判断是否可以删除
就是处理括号 内部最低运算符 和 括号左边 以及括号右边的关系

回复
许野平 2002-07-23
我打算写一个解法,有兴趣的清等...
回复
ynli2002 2002-07-23
应该用栈实现
找一个计算器源程序读读
回复
dearmite 2002-07-23
关注
回复
dearmite 2002-07-23
ml_jack(Jack)
也不行呀
:(a+b)+c
和:a+(b+c)都是没有用的,怎么才能分出他们呢
回复
yougaocuo 2002-07-23
c程序怎么写呢?有没有可以给范例的?????
回复
fwbmail 2002-07-22
我是这样想的 :
1.进入一个括号前,记录括号前的所有算式的最高优先权符号a
2.在括号内的算式的最低优先权符号b
3.括号后面的最高优先权符号c

如果b>=a && c>=b,则这个括号没有用

只是简单地推测了一下,没有考虑细节,你可以扩展一下
回复
zhouxinghai 2002-07-22
好问题,收藏
回复
Superping 2002-07-22
用c编过计算器吗,通过栈实现,很简单,建议参考计算器的源程序
回复
ml_jack 2002-07-22
将表达式转化为逆波兰式(没括号的)
如果一对括号去掉后该逆波兰式不变,则可去掉
一遍扫描只判断一个括号是否能去掉,从最内层开始

似乎有些麻烦...
这是我看题直接想到的

大家讨论一下应该有更好的方法!!! :)
回复
nethermit 2002-07-22
扫描一遍,做一个堆栈,算法应该很简单的
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告