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

样例输出样例一:

  1. a+b+c-d
  2. 样例二:
  3. a+b/(c+d)
  4. 样例三:
  5. a*b+c/d
  6. 样例四:
  7. (a+b)*f-i/j

题目解析:

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

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

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

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

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

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

  其他情况不能删除。

示例代码:

  1. #include<stdio.h>
  2.  
  3. //检测括号是否可以删除
  4. int check(char s[], int left, int right)
  5. {
  6. int i; //下标
  7. int leftCount; //左括号统计
  8.  
  9. //处理 ' -(a +|- b) '
  10. if (s[left-] == '-')
  11. {
  12. i = left;
  13. leftCount = ;
  14. while (++i < right) {
  15. if (s[i] == '(')
  16. {
  17. leftCount++;
  18. }
  19. else if ((s[i] == '+' || s[i] == '-' ) && leftCount == )
  20. {
  21. return ;
  22. }
  23. }
  24. }
  25.  
  26. //处理 ' /(a +|-|*|/ b) '
  27. if (s[left-] == '/')
  28. {
  29. return ;
  30. }
  31.  
  32. //处理 ' +(a +|-|*|/ b) +|- '
  33. if (s[left-] != '*' && s[left-] != '/' &&
  34. s[right+] != '*' && s[right+] != '/')
  35. {
  36. return ;
  37. }
  38.  
  39. //处理 ' *(a *|/ b) +|-|*|/ '
  40. i = left;
  41. leftCount = ;
  42. while (++i < right) {
  43. if (s[i] == '(')
  44. {
  45. leftCount++;
  46. }
  47. else if ((s[i] == '*' || s[i] == '/' ) && leftCount == )
  48. {
  49. return ;
  50. }
  51. }
  52. return ;
  53. }
  54.  
  55. //删除多余的括号
  56. int delExcessBrackets(char s[], int index)
  57. {
  58. int left, right;
  59. while (s[index] != '\0') {
  60. if (s[index] == ')') //如果为右括号,返回下标
  61. {
  62. return index;
  63. }
  64. if (s[index] == '(') //如果为左括号,找到右括号的下标
  65. {
  66. left = index;
  67. index = right = delExcessBrackets(s, index+);
  68.  
  69. if (check(s, left, right)) //若检测结果为可以删除,那么把括号位置换成空
  70. {
  71. s[left] = s[right] = ' ';
  72. }
  73. }
  74. index++;
  75. }
  76. }
  77.  
  78. int main()
  79. {
  80. char exp[];
  81. scanf("%s", exp);
  82.  
  83. delExcessBrackets(exp, );
  84.  
  85. int i = -;
  86. while (exp[++i] != '\0') {
  87. if (exp[i] != ' ')
  88. {
  89. printf("%c", exp[i]);
  90. }
  91. }
  92.  
  93. return ;
  94. }

蓝桥杯 算法训练 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. Java 多线程 - 转载

    下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...

  2. Mysql 分组聚合实现 over partition by 功能

    mysql中没有类似oracle和postgreSQL的 OVER(PARTITION BY)功能. 那么如何在MYSQL中搞定分组聚合的查询呢 先说结论: 利用 group_concat + sub ...

  3. MD5加密算法的java实现

    package other; import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/* * ...

  4. ActiveMQ_01

    http://shhyuhan.iteye.com/blog/1278103http://www.cnblogs.com/blsong/archive/2012/09/26/2704337.htmlh ...

  5. $1...$9 属性 (RegExp) (JavaScript)

    返回在模式匹配期间找到的,所存储的最近的九个部分. 只读.     RegExp.$n 参数     RegExp 始终为全局 RegExp 对象. n 1 至 9 之间的任意整数. 备注     每 ...

  6. mysql数据库优化课程---9、php用什么写的

    mysql数据库优化课程---9.php用什么写的 一.总结 一句话总结:php是用c语言写的,所以php里面的那些模块什么都是c语言 c 1.php用什么写的? c php是用c语言写的,所以php ...

  7. django从请求到返回都经历了什么[转]

    原文地址:http://projectsedu.com/2016/10/17/django从请求到返回都经历了什么/ 从runserver说起 ruserver是使用django自己的web serv ...

  8. 五十一 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目

    scrapyd模块是专门用于部署scrapy项目的,可以部署和管理scrapy项目 下载地址:https://github.com/scrapy/scrapyd 建议安装 pip3 install s ...

  9. js监测滚动条到达最底边

    scroll : function(){ $(window).scroll(function () { var scrollTop = $(this).scrollTop(); var scrollH ...

  10. Http请求get和post调用

    工作中会遇到远程调用接口,需要编写Http请求的共通类 以下是自己总结的Http请求代码 package com.gomecar.index.common.utils; import org.apac ...