算法训练 删除多余括号
@ 蓝桥杯 练习系统 算法训练 ALGO-57
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简。另外不考虑’+’ '-'用作正负号的情况,即输入表达式不会出现(+a)或(-a)的情形。
输入格式
表达式字符串,长度不超过255, 并且不含空格字符。表达式中的所有变量都是单个小写的英文字母, 运算符只有加+减-乘*除/等运算符号。
输出格式
去掉多余括号后的表达式
测试样例1
Input:
a+(b+c)-dOutput:
a+b+c-d
测试样例2
Input:
a+b/(c+d)Output:
a+b/(c+d)
测试样例3
Input:
(a*b)+c/dOutput:
a*b+c/d
测试样例4
Input:
((a+b)*f)-(i/j)Output:
(a+b)*f-i/j
ACcode:
import java.io.*;
import java.util.*;public class Main {static int len;static byte[] line;static Queue<Item> queue;public static void main(String[] args) throws IOException {PrintWriter out = new PrintWriter(System.out);len = System.in.read(line = new byte[257], 1, 256);queue = new LinkedList();line[0] = line[len] = '+';for (int i = 0; i < len; i++)if (line[i] == '(')i = push(i, new Item(i));while (queue.size() > 0)queue.poll().delete();for (int i = 1; i < len; i++)if (line[i] < 127)out.write(line[i]);out.close();}static int push(int i, Item now) {while (line[i] != ')')if (line[++i] == '(')i = push(i + 1, new Item(i));else if (line[i] < '0' && line[i] > ')' && (line[i] == '+' || line[i] == '-'))now.tag = true;queue.offer(now);return (now.r = i) + 1;}static class Item {int l, r;boolean tag;Item(int l) { this.l = l; }boolean delete() {int l = this.l, r = this.r;byte ltag = line[--l], rtag = line[++r];while (ltag >= '0' || ltag <= ')') ltag = line[--l];if (ltag == '/') return false;if (ltag == '-' && this.tag)return false;if (ltag == '*' && this.tag)return false;while (rtag >= '0' || rtag <= ')') rtag = line[++r];if ((rtag == '*' && !this.tag) || (((ltag == '+' || ltag == '-') && (rtag == '+' || rtag == '-')))) {line[this.l] = line[this.r] = 127;return true;}return false;}}
}
先递归取得所有括号对信息再讨论
if (ltag == '/') return false;
if (ltag == '-' && this.tag)return false;
if (ltag == '*' && this.tag)return false;
if (rtag == '*' && !this.tag) return true;
if (((ltag == '+' || ltag == '-') && (rtag == '+' || rtag == '-'))) return true;
this.tag
标记该组括号内运算符优先级最低是加减还是乘除
ltag
、 rtag
分别表示括号组左右最近的运算符
若 ltag == '/'
则无法删除
若 this.tag ∈ '+','-'
,ltag ∈ '-','*','/'
则无法删除
若 ltag,rtag ∈ '+','-'
无视括号里的内容都可以删除括号,因为上述条件中已经对 ltag ∈ '-'
先行做出处理
若 this.tag,ltag ∈ '*','/'
无视括号里的内容都可以删除括号,因为上述条件中已经对 ltag ∈ '/'
先行做出处理
其余情况皆视为无法删除括号对
毕竟不需要公式化简,所以这些很基础的东西就可以实现该题
算法训练 删除多余括号相关推荐
- Java实现 蓝桥杯VIP 算法训练 删除多余括号
算法训练 删除多余括号 时间限制:1.0s 内存限制:512.0MB 问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且 ...
- Java实现 蓝桥杯 算法训练 删除数组零元素
算法训练 删除数组零元素 时间限制:1.0s 内存限制:512.0MB 提交此题 从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移 ...
- java蓝桥杯练习 删除多余括号
java蓝桥杯练习 删除多余括号 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算 ...
- [算法设计与分析]第三章练习题:删除多余括号
问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简.另外不考虑'+' '-'用作正负号的情况, ...
- Java 算法 删除多余括号
这里写目录标题 题目描述 解题思路 代码 题目描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简. ...
- 蓝桥杯 ALGO-79 算法训练 删除数组零元素
从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素, 其后元素向数组首端移动.注意,CompactIntegers函数需要接受数组及其元素个数作为参数, ...
- 蓝桥杯练习系统习题-算法训练3
文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 蓝桥杯练习系统习题-算法训练3 题目搜索方式:Ctrl+F--> 输入题目名称-> ...
- 代码随想录算法训练Day11 LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)
代码随想录算法训练Day11 | LeetCode232. 用栈实现队列(模拟):225.用队列实现栈(模拟):20. 有效的括号(栈应用):1047. 删除字符串中的所有相邻重复项(栈应用) 关于栈 ...
- 算法训练 字符删除 c语言
算法训练 字符删除 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,先输入一个字符串str(长度不超过20),再输入单独的一个字符ch,然后程序会把字符串str当中出现的所有的c ...
最新文章
- java面试题标签_java面试笔试题 (WEB)
- A Multi-task Deep Network for Person Re-identification
- Python 随机森林分类
- live555 源码分析:简介
- leetcode 303. 区域和检索 - 数组不可变(Java版)
- mysql 案例 ~ pt修复工具的使用
- 你们好好的学,回头教教我~
- linux程序改ip地址吗,如何在Linux中从C设置IP地址
- 数据结构之B+树插入详解
- 开发笔记1 关于指针,结构体使用指针的问题
- 色彩专题(PS的颜色理论)
- 基于AD9854的DDS信号发生器设计
- Unity 使用混音器AudioMixer改变语速而不改变音色
- 体积小性能强悍能吃鸡的电脑主机 NUC8I7HVK
- python符号积分
- iphone panic故障对照表_苹果 AirPods 新维修工具上线:可区分是污垢堵塞还是故障 - AirPods...
- 使用Hexo平台搭建个人博客
- 解析物流行业分账规则
- 2020年电力电缆试题及答案及电力电缆考试平台
- java完整的利用itext5制作pdf、二维码图片插入pdf,并解析pdf中的二维码信息