社区
数据结构与算法
帖子详情
怎样求删除括号???
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程序!)谢了!!
...全文
117
14
打赏
收藏
怎样求删除括号???
问题描述: 输入一个表达式,将其中不需要的括号删去。如: 输入:(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程序!)谢了!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
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
打赏
举报
回复
应该用栈实现
找一个计算器源程序读读
项目张雪峰之巅
2002-07-23
打赏
举报
回复
关注
项目张雪峰之巅
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
打赏
举报
回复
扫描一遍,做一个堆栈,算法应该很简单的
Java实现 LeetCode 301
删除
无效的
括号
该博客围绕LeetCode 301题“
删除
无效的
括号
”展开,需用Java实现
删除
最小数量的无效
括号
,使输入字符串有效并返回所有可能结果。输入可能含除 ( 和 ) 以外字符,还给出了如 “()())()”“(a)())()”“)(” 等示例及对应输出。
删除
括号
博客围绕删
括号
展开,强调删
括号
时要保证左
括号
数量比右
括号
多。对于能否转化类的 dp 题,状态转移基本是 1/0,用 dp[i][j][k] 表示考虑 A 前 i 个匹配 B 前 j 个,A 被
删除
部分左
括号
数减右
括号
数等于 K,题解采用标记法,若能转化为最终状态则进行下一步转移。
在 Microsoft Office Word 中如何
删除
括号
和
括号
内的文字
本文介绍了一种在Microsoft Word中批量
删除
括号
及其内部文字的方法,适用于大量
括号
存在的文档,通过替换操作实现快速清理。
word中的方
括号
怎么删_word中怎么快速
删除
所有的
括号
及内容
本文介绍了如何利用Word的替换功能结合通配符,一次性
删除
文档中各种
括号
(中
括号
、小
括号
、大
括号
、尖
括号
)内的全部内容。通过设置查找内容为特定
括号
的通配符形式,并在替换为输入框留空,然后启用使用通配符选项,可以高效完成批量
删除
操作。
删除
无效
括号
该博客主要讨论如何从包含无效
括号
的字符串中
删除
最少的
括号
,使其变得有效。通过遍历输入字符串,统计左
括号
和右
括号
出现的次数,然后递归地尝试
删除
括号
来找到解决方案。在每次
删除
操作后,检查
括号
是否有效,并将有效字符串添加到结果列表中。算法还包含了检查
括号
有效性的辅助函数。
数据结构与算法
33,026
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章