原题链接:去括号
#include <iostream>
#include <cstring>
using namespace std;
void qukuohao(int left,int right,char a[])
{
int inside,outside;//括号内等级和括号外等级
int zuo,you;//左括号等级和右括号等级
//对于括号外等级,只要判断括号外一格的符号
if(left==0||a[left-1]=='('||a[left-1]=='+'||a[left-1]==-1)zuo=1;
else if(a[left-1]=='-')zuo=2;//-在括号前面等级介于'+'和'*'之间
else if(a[left-1]=='*')zuo=3;
else if(a[left-1]=='/')zuo=4;//除同理
else if(a[left-1]=='^')zuo=5;
if(right==strlen(a)-1||a[right+1]==')'||a[right+1]=='+'||a[right+1]=='-'||a[right+1]==-1)you=1;
else if(a[right+1]=='*'||a[right+1]=='/')you=3;
else if(a[right+1]=='^')you=5;
outside=zuo>you?zuo:you;
//对于括号内等级,要么括号内一格是括号,要么括号内两格是符号
if(a[left+1]=='('||a[left+2]=='+'||a[left+2]=='-'||a[left+2]==-1||a[left+2]==')')zuo=1;
else if(a[left+2]=='*'||a[left+2]=='/')zuo=3;
else if(a[left+2]=='^')zuo=5;
if(a[right-1]==')'||a[right-2]=='+'||a[right-2]=='-'||a[right-2]==-1||a[right-2]=='(')you=1;
else if(a[right-2]=='*'||a[right-2]=='/')you=3;
else if(a[right-2]=='^')you=5;
inside=zuo>you?zuo:you;
if(inside>=outside)//若括号内等级大于等于括号外等级去括号
{
a[left]=-1;
a[right]=-1;
}
}
int main()
{
char a[21];
while(1)
{
cin.getline(a,21);
if(a[0]=='\0'||a[0]=='#')break;
int len=strlen(a);
int left=0,right=0;
while(left<len&&len)
{
//下一左括号
while(left<len)
{
if(a[left]=='(')break;
left++;
}
//下一右括号
right=left+1;
int temp=0;//表示中间括号数量
while(right<len)
{
//跳过中间括号
if(a[right]==')'&&temp==0)break;
else if(a[right]==')'&&temp!=0)temp--;
else if(a[right]=='(')temp++;
right++;
}
if(left<len)qukuohao(left,right,a);
left++;
}
//打印
for(int i=0;i<len;i++)
if(a[i]!=-1)cout<<a[i];
cout<<endl;
}
return 0;
}
3 分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复