首页 > 编程语言 >蓝桥杯 ALGO-57算法训练 删除多余括号

蓝桥杯 ALGO-57算法训练 删除多余括号

时间:2022-12-02 21:01:46浏览次数:47  
标签:ch return int 57 list 蓝桥 ++ ALGO str


时间限制:1.0s 内存限制:512.0MB
问题描述
  从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简。另外不考虑’+’  ‘-‘用作正负号的情况,即输入表达式不会出现(+a)或(-a)的情形。
输入格式
  表达式字符串,长度不超过255,  并且不含空格字符。表达式中的所有变量都是单个小写的英文字母, 运算符只有加+减-乘*除/等运算符号。
输出格式
  去掉多余括号后的表达式
样例输入
样例一:a+(b+c)-d样例二:a+b/(c+d)样例三:(a*b)+c/d样例四:((a+b)*f)-(i/j)
样例输出
样例一:a+b+c-d样例二:a+b/(c+d)样例三:a*b+c/d样例四:(a+b)*f-i/j

【分析】此题的关键在于遍历算式时,先判断符号,然后判断括号,在“+”或者“-”的前后如果有括号,是可以直接删掉的,“*”和“/”符号前后的括号则不能删。由于待输出的算式长度不一定,则可以考虑使用集合来存贮算式,最后遍历输出即可。
【参考代码】
C++:

#include "iostream"
#include "string"
#include "stdio.h"
#include "ctype.h"
#include "algorithm"
#include "stack"
using namespace std;

int cacluExprePriority(string str,bool &hasC)
{
int left=0;
int right=0;
bool bfind=false;
for(int i=0;i<str.size();i++)
{
if(str[i]=='(')
left++;
if(str[i]==')')
right++;
if(str[i]=='/')
hasC=true;
if(str[i]=='*'||str[i]=='/')
{
if(left==right)
return 2;
}
if(str[i]=='+'||str[i]=='-')
{
bfind=true;
}
}
return bfind?1:-1;
}
bool vis[1000];
int safe(int i,int n)
{
if(i<0)
return 0;
if(i>=n)
return n-1;
return i;
}
void findIndexOfBrackets(string str)
{
stack<int>q;
for(int i=0;i<str.size();i++)
{
if(str[i]=='(')
{
q.push(i);
}
if(str[i]==')')
{
int s=q.top();
int t=i;
bool hasC=false;
int priority=cacluExprePriority(str.substr(s+1,t-s-1),hasC);
q.pop();
bool temp=false;
if(s-1>=0&&cacluExprePriority(str.substr(safe(s-1,str.size()),1),temp)>=cacluExprePriority(str.substr(safe(t+1,str.size()),1),temp))
{
char op=str[s-1];
{
if(op=='+')
{
vis[s]=vis[t]=true;
}
if(op=='-')
{
if(priority==2)
vis[s]=vis[t]=true;
}
if(op=='*')
{
if(priority==2&&hasC==false)
vis[s]=vis[t]=true;
}
}
}
else if(t+1<str.size())

{


char op=str[t+1];
if(op=='+'||op=='-')
{
vis[s]=vis[t]=true;
}

if(op=='*'||op=='/')
{
if(priority==2)
vis[s]=vis[t]=true;
}
}
}
}

}
int main()
{
string exper;
cin>>exper;

findIndexOfBrackets(exper);
for(int i=0;i<exper.size();i++)
if(vis[i]==false)
cout<<exper[i];
cout<<endl;

return 0;
}

C:

#include <stdio.h>
int q(char *ch)
{
int i=0,z=0;
ch[i] = '#';
while (ch[i] != ')'||z!=0)
{
if (ch[i]=='(')
{
z++;
}
if (ch[i]==')')
{
z--;
}
i++;
}
ch[i] = '#';

return i;
}



int f(char *ch, char a)
{
int i = 0,jj=0;

if (a == '+')
{
while (ch[i] != ')')
{
if (ch[i+1] == '(')
if (f(&ch[i], ch[i - 1]) == 0)
i += q(&ch[i]);
else
{
while (ch[i] != ')')
{
i++;
}
}
i++;
}

if (ch[i + 1] == '*' || ch[i + 1] == '/')
{
return 1;
}
else
{
return 0;
}

}
if (a == '-')
{
while (ch[i] != ')')
{
if (ch[i] == '(')
if (f(&ch[i+1], ch[i - 1]) == 0)
i += q(&ch[i]);
else
{
while (ch[i] != ')')
{
i++;
}
}
if (ch[i] == '+' || ch[i] == '-')
return 1;
i++;
}
if (ch[i + 1] == '*' || ch[i + 1] == '/')
{
return 1;
}
else
{
return 0;
}
}
if (a == '*')
{
while (ch[i] != ')')
{
if (ch[i] == '(')
if (f(&ch[i+1], ch[i - 1]) == 0)
q(&ch[i]);
else
{
while (ch[i] != ')')
{
i++;
}
}
if (ch[i] == '+' || ch[i] == '-')
return 1;
i++;
}
return 0;
}
if (a == '/')
{
while (ch[i] != ')')
{
if (ch[i] == '(')
if (f(&ch[i+1], ch[i - 1]) == 0)
q(&ch[i]);
else
{
while (ch[i] != ')')
{
i++;
}
}

if (ch[i] == '+' || ch[i] == '-' || ch[i] == '/' || ch[i] == '*')
return 1;

i++;
}
}
while (ch[i] != ')')
{
if (ch[i] == '(')
if (f(&ch[i+1], ch[i - 1]) == 0)
i += q(&ch[i]);
else
{
while (ch[i] != ')')
{
i++;
}
}
if (ch[i] == '+' || ch[i] == '-')
jj=1;
i++;
}
if ((ch[i + 1] == '*' || ch[i + 1] == '/')&&jj==1)
{
return 1;
}
else
{
return 0;
}
}
void g(char *a)
{
int i = 0;
while (a[i]!='\0')
{
if (a[i] == '(')
if (f(&a[i + 1], a[i - 1]) == 0)
q(&a[i]);
else
{
while (a[i] != ')')
{
i++;
}
}
i++;
}
}

int main()
{
int l = 0, i = 0;
char ch[100];
scanf("%s", ch);
g(ch);


while (ch[i]!='\0')
{
if (ch[i]!='#')
{
printf("%c", ch[i]);
}
i++;

}
return 0;
}

Java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] chs = br.readLine().toCharArray();
List<Character> list = new ArrayList<Character>();
for (int i = 0; i < chs.length; i++) {
list.add(chs[i]);
}
String s = "";
for (int i = 0; i < func(list).size(); i++) {
s += list.get(i);
}
System.out.println(s);
}

public static List<Character> func(List<Character> list) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == '+' || list.get(i) == '-') {
if (list.get(i - 1) == ')' && list.get(i + 1) == '(') {
list.remove(i - 1);
list.remove(i);
for (int j = i - 1; j > -1; j--) {
if (list.get(j) == '(') {
list.remove(j);
break;
}
}
for (int k = i + 1; k < list.size(); k++) {
if (list.get(k) == ')') {
list.remove(k);
break;
}
}
}
if (list.get(i - 1) == ')') {
list.remove(i - 1);
for (int j = i - 1; j > -1; j--) {
if (list.get(j) == '(') {
list.remove(j);
break;
}
}
}
if (list.get(i + 1) == '(') {
if (list.get(i) == '+')
for (int k = i + 1; k < list.size(); k++) {
if (list.get(k) == ')' && !list.contains('/')
&& !list.contains('*')) {
list.remove(k);
list.remove(i + 1);
break;
}
}
}
}
}
return list;
}
}


标签:ch,return,int,57,list,蓝桥,++,ALGO,str
From: https://blog.51cto.com/linmengmeng/5907469

相关文章

  • 蓝桥杯 ALGO-31算法训练 开心的金明
    时间限制:1.0s内存限制:256.0MB关键字:01背包动态规划问题描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,......
  • 蓝桥杯 ALGO-30算法训练 入学考试
    时间限制:1.0s内存限制:256.0MB关键字:0/1背包动态规划问题描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。......
  • 蓝桥杯 ALGO-29算法训练 校门外的树
    时间限制:1.0s内存限制:256.0MB关键字:区间处理问题描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的......
  • 蓝桥杯 ADV-103算法提高 逆序排列
    关键字循环语句数组操作问题描述编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中。当用户输入0时,表示输入结束。然后程序将把这个数组中的值按......
  • 蓝桥杯 ALGO-40算法训练 会议中心 (APIO 2009)
    时间限制:2.0s内存限制:512.0MB关键字:APIO2009会议中心Siruseri政府建造了一座新的会议中心。许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议。......
  • 蓝桥杯 ALGO-55算法训练 矩阵加法
    时间限制:1.0s内存限制:512.0MB问题描述给定两个N×M的矩阵,计算其和。其中:N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000。输入格式输入数......
  • 蓝桥杯 ALGO-45算法训练 调和数列问题
    问题描述输入一个实数x,求最小的n使得,1/2+1/3+1/4+…+1/(n+1)>=x。输入的实数x保证大于等于0.01,小于等于5.20,并且恰好有两位小数。你的程序要能够处理多组数据,即......
  • 蓝桥杯 ALGO-34算法训练 纪念品分组
    时间限制:1.0s内存限制:256.0MB关键字:贪心排序问题描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对......
  • vulfocus redis 未授权访问 (CNVD-2015-07557)
    一、简介1.Redis是一套开源的使用ANSIC编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的API。2.Redis默认端口:6379,如果在没有开启认证的......
  • algorithm of linking clip-level action detections
    2017TCNN- TubeConvolutionalNeuralNetwork(T-CNN)forActionDetectioninVideos-ICCV 这篇论文的clip-levellinking算法其实是从2015年findactiontubes论......