一个去算术式冗余括号的程序

swat_01 2009-07-20 11:14:54
主旨是去除冗余的括号 如:(a+b)+c -> a+b+c
((a-b)*c) -> (a-b)*c

源程序如下
#include<iostream>
#include<string>
using namespace std;
string str;
bool panB(int beg,int end, bool *a)
{
if(beg==0)return 1;
int i;
for(i=beg-1;i>=0;--i)if(str[i]!=' ')break;
if(i<0)return 1;
if(str[i] == '('|| str[i]== '+' ) return 1;
if(str[i] == '/')return 0;
if(a[0]||a[1])return 0;
else return 1;
}
bool panE(int beg,int end,bool *a)
{
if(end==str.size()-1)return 1;
int i;
for(i=end+1;i<str.size();++i)if(str[i]!=' ')break;
if(i>=str.size())return 1;
if(str[i]=='+'||str[i]=='-')return 1;
if(a[0]||a[1])return 0;
else return 1;
}
int main(int argc, char* argv[])
{
int n, i, j, flag1, flag2;
cin>>n;
while(n--)
{
cin>>str;
int count = 0;
for(i=0;i<str.size();++i)
{
bool fhao[2] = {0};
if(str[i]=='(')
{
flag1 = i;
count ++;
for(j=i+1;j<str.size();++j)
{
if(str[j]=='(')
count++;
if(str[j]==')')
{
count --;
if(!count)
{
flag2 = j;
break;
}
}
if(count==1)
{
if(str[j]=='+') fhao[0] = 1;
if(str[j]=='-') fhao[1] = 1;
}
}
}
else continue;
if(panB(flag1,flag2,fhao) && panE(flag1,flag2,fhao))
{
str[flag1] = ' ';
str[flag2] = ' ';
}
}
for(i=0;i<str.size();++i)
{
if(str[i]==' ')continue;
cout<<str[i];
}
cout<<endl;
}
return 0;
}


为什么 (a+b)/(c)/(e*f) 过不去?
...全文
90 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
光宇广贞 2009-07-21
  • 打赏
  • 举报
回复
没有看到任何处理算式的合适的数据结构啊……算法上不正确也就可以理解了。

像去括号这种……用栈啊……

还可以构建算式树。

总之,重新设计吧。
liao05050075 2009-07-21
  • 打赏
  • 举报
回复
这个题目我以前做过,当时用的是中缀表达式转后缀表达式,然后再转回来就行了.
Rico_Liu 2009-07-21
  • 打赏
  • 举报
回复
冗余括号,是不是还要比较运算符号优先级?
DarkChampion 2009-07-20
  • 打赏
  • 举报
回复
a+(c)可以
a/(c)不可以
楼主检查检查你对符号的处理吧

65,208

社区成员

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

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