算法训练 删除多余括号  
时间限制: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. 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE

    概念和区别 SELECT ... LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS ...

  2. github上十二款最著名的Android播放器开源项目

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  3. 【python教程】Python JSON

    环境配置 在使用 Python 编码或解码 JSON 数据前,我们需要先安装 JSON 模块.本教程我们会下载 Demjson 并安装: $tar xvfz demjson-1.6.tar.gz $c ...

  4. shell基础复习笔记

    变量的设置 以等号连接,等号两边不能有空格 变量名首个字符必须是英文,可以使用下划线,不能使用标点符号,不能使用bash里的关键字 可以使用转义字符\将特殊符号(如Enter.$.空格.!等)变成一般 ...

  5. .NET中 数据库连接

    (转自:http://www.iwms.net/n459c12.aspx) SQL Server ODBC  Standard Security:"Driver={SQL Server};S ...

  6. Spring Struts2 整合

    Spring整合Struts2 整合什么?——用IoC容器管理Struts2的Action如何整合?第一步:配置Struts21.加入Struts2的jar包.2.配置web.xml文件.3.加入St ...

  7. LeetCode OJ:Pascal's Triangle(帕斯卡三角)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  8. Struts2 用过滤器代替了 servlet ,???? 且不需要tomcat就可以直接做功能测试

    Struts2  用过滤器代替了 servlet ,????  且不需要tomcat就可以直接做功能测试

  9. L126

    Like so many things, it is not what's outside, but what is inside that counts. 许多事物都是如此,外表看起來虽不起眼,但是 ...

  10. 2017.11.6对比Gerber差异+确认元器件方向,封装

    1比对新旧版本的gerber差异      导入两个版本.其中主要的是bot(底层),Smt(元器件),sst(丝印层),top(顶层) 底层和顶层可以看出走线layout的差别,这点很重要,上次客户 ...