算法训练 删除多余括号  
时间限制: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

题目解析:

  本道题其实化简表达式,这是我们小学学到的内容,即题目中写到:结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简。

  遍历输入的表达式,如果发现左括号,则找到与它对应的右括号,并根据括号左右及中间内容分情况处理该括号是否可以删除。在递归地处理过程中,如果又发现了括号,则先处理发现的这个括号是否可以删除,处理结束后,返回上一个括号,继续递归处理,直至所有的括号处理完成。

  有以下几种情况括号是不可以删除的:

  1. 括号前边为 “ - ”,且括号中为 “ + ” 或 “ - ”,不能删除;
  2. 括号前边为 “ / ”,不能删除;
  3. 括号后为 “ * ”,且括号中为 “ + ” 或 “ - ”,不能删除;

  有以下几种情况是可以删除:

  1. 括号前和后为 “ + ” 或 “ - ”,括号中为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除,但是注意:若括号前为 “ - ”,括号中为 “ + ” 或  “ - ”,在前边已经处理了,所以可以排除这种情况;
  2. 括号前为 “ * ”,括号中为 “ * ” 或 “ / ”,括号后为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除;

  其他情况不能删除。

示例代码:

 #include<stdio.h>

 //检测括号是否可以删除
int check(char s[], int left, int right)
{
int i; //下标
int leftCount; //左括号统计 //处理 ' -(a +|- b) '
if (s[left-] == '-')
{
i = left;
leftCount = ;
while (++i < right) {
if (s[i] == '(')
{
leftCount++;
}
else if ((s[i] == '+' || s[i] == '-' ) && leftCount == )
{
return ;
}
}
} //处理 ' /(a +|-|*|/ b) '
if (s[left-] == '/')
{
return ;
} //处理 ' +(a +|-|*|/ b) +|- '
if (s[left-] != '*' && s[left-] != '/' &&
s[right+] != '*' && s[right+] != '/')
{
return ;
} //处理 ' *(a *|/ b) +|-|*|/ '
i = left;
leftCount = ;
while (++i < right) {
if (s[i] == '(')
{
leftCount++;
}
else if ((s[i] == '*' || s[i] == '/' ) && leftCount == )
{
return ;
}
}
return ;
} //删除多余的括号
int delExcessBrackets(char s[], int index)
{
int left, right;
while (s[index] != '\0') {
if (s[index] == ')') //如果为右括号,返回下标
{
return index;
}
if (s[index] == '(') //如果为左括号,找到右括号的下标
{
left = index;
index = right = delExcessBrackets(s, index+); if (check(s, left, right)) //若检测结果为可以删除,那么把括号位置换成空
{
s[left] = s[right] = ' ';
}
}
index++;
}
} int main()
{
char exp[];
scanf("%s", exp); delExcessBrackets(exp, ); int i = -;
while (exp[++i] != '\0') {
if (exp[i] != ' ')
{
printf("%c", exp[i]);
}
} return ;
}

蓝桥杯 算法训练 ALGO-57 删除多余括号的更多相关文章

  1. Java实现 蓝桥杯 算法训练 删除数组零元素

    算法训练 删除数组零元素 时间限制:1.0s 内存限制:512.0MB 提交此题 从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移 ...

  2. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  3. Java实现蓝桥杯 算法训练 大等于n的最小完全平方数

    试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...

  4. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  5. 蓝桥杯 算法训练 ALGO-50 数组查找及替换

    算法训练 数组查找及替换   时间限制:1.0s   内存限制:512.0MB 问题描述 给定某整数数组和某一整数b.要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序.如果数组元 ...

  6. 蓝桥杯 算法训练 ALGO-156 表达式计算

    算法训练 表达式计算   时间限制:1.0s   内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输 ...

  7. 蓝桥杯 算法训练 ALGO-119 寂寞的数

    算法训练 寂寞的数 时间限制:1.0s   内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和.例如,d(2 ...

  8. Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)

    ** 算法训练 字符串的展开 ** 题目: 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于"d-h" ...

  9. Java实现 蓝桥杯 算法训练 求和求平均值

    试题 算法训练 求和求平均值 问题描述 从键盘输入10个浮点数,求出它们的和以及平均值,要求用函数实现 输入格式 测试数据的输入一定会满足的格式. 1 10 (1行10列的向量) 输出格式 要求用户的 ...

随机推荐

  1. 使用SpringMVC的crud操作时,进行数据修改,但是修改成功后,页面无法显示lastName属性值(被修改的那条记录)

    我这个错误的原因在于,把map的键写错了,它必须和类名第一个字母小写相同 @ModelAttribute public void getEmployee(@RequestParam(value=&qu ...

  2. 报错Mapped Statements collection does not contain value for com.atguigu.mybatis.dao.EmployeeMapperPlus

    报错Mapped Statements collection does not contain value for com.atguigu.mybatis.dao.EmployeeMapperPlus ...

  3. 如何进行数据库,比如ORACLE,SQL SERVER的逆向工程,将数据库导入到PowerDesigner中

    Oracle的反向工程就是指将Oracle中的数据库,当然也可以是SQL Server中的数据库导入到PD中,这个需要建立一个数据库的链接,然后进行逆向工程的操作. 第一步:建立数据库的链接: Pow ...

  4. C# imgage图片转base64字符/base64字符串转图片另存成

    //图片转为base64编码的字符串 protected string ImgToBase64String(string Imagefilename) { try { Bitmap bmp = new ...

  5. MySQL数据库维护、备份、和复制

    预防性维护的基本原则:1)启动MySQL服务器提供的自动恢复功能2)有计划的开展预防心维护工作,定期对表进行检查,日常的表检查有助于及时发现各种小问题,并在问题变得更糟之前将其纠正.3)建立数据库备份 ...

  6. OpenStack Mitaka HA部署方案(随笔)

    [Toc] https://github.com/wanstack/AutoMitaka # 亲情奉献安装openstack HA脚本 使用python + shell,完成了基本的核心功能(纯二层的 ...

  7. Oracle归档模式与非归档模式设置

    (转自:http://www.cnblogs.com/spatial/archive/2009/08/01/1536429.html) Oracle的日志归档模式可以有效的防止instance和dis ...

  8. Java8_02_lambda表达式

    一.前言 这一节我们来了解下lambda表达式,主要关注以下几点: 行为参数化 匿名类 Lambda 表达式 方法 引用 二.行为参数化 1.概念 行为参数化(behavior parameteriz ...

  9. 剑指offer--30.二叉搜索树的后序遍历序列

    正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...

  10. 2017.11.15 Add a parameter –serial <serial no> to the Target field.

    1 exe创建快捷方式,并且加后缀  program --serial 50114130   这是Win里面的一种调用说明. Please note that the programming logs ...