java实现表达式求值 (20 分)-------非递归版
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近由学会了一些简单的函数求值。比如,它知道函数min(20, 23)的值是20, add(10, 98)的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为: 1、 一个正的十进制数x是一个表达式。 2、 如果x和y是表达式,则函数min(x, y)也是表达式,其值为x,y中的最小数。 3、 如果x和y是表达式,则函数max(x, y)也是表达式,其值为x,y中的最大数。 4、 如果x和y是表达式,则函数add(x,y)也是表达式,其值为x,y之和。 5、 如果x和y是表达式,则函数sub(x,y)也是表达式,其值为x,y之差。 例如,表达式 max(add(1,2),7)的值为7。
请你编写程序,对于给定的一组表达式,帮助Dr.Kong算出正确答案,以便校对卡多计算的正误。
输入格式:
第一行:N表示要计算的表达式个数(1≤N≤10) 接下来有N行,每行是一个字符串,表示待求值的表达式。 (表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不超过1000)
输出格式:
输出有N行,每一行对应一个表达式的值。
输入样例:
在这里给出一组输入。例如:
3
add(1,2)
sub(1,999)
add(min(1,1000),add(100,99))
输出样例:
在这里给出相应的输出。例如:3
-998
200
代码:
import java.util.*;
class NUM{
private int left;
private int right;
public int getLeft() {
return left;
}
public void setLeft(int left) {
this.left = left;
}
public int getRight() {
return right;
}
public void setRight(int right) {
this.right = right;
} }
public class Main { public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();sc.nextLine();
Stack<String> stk = new Stack<String>();
Stack<Integer> stkNum = new Stack<Integer>();
int k=0;
for(int i =0 ;i< N;i++){
String line = sc.nextLine();
if(line.length() == 1){
int num = Integer.parseInt(line);
System.out.println(num);
}else{
int index = 0;
int p=0;
while(true){
index = line.indexOf("(",index+1);
if(index == -1) break;
p = line.indexOf(",",p+1);
if(p == -1) break; NUM num = getNum(p,line);
if(num.getLeft()!=-999){
stkNum.push(num.getLeft());
}
if(num.getRight()!=-999) {
stkNum.push(num.getRight());
}
String sub = line.substring(index-3, index);
stk.push(sub);
}
while(stk.size()!=0){
String opt = stk.pop();
if(opt.equals("min")){
int d = min(stkNum.pop(),stkNum.pop());
stkNum.push(d);
}else if(opt.equals("max")){
int d = max(stkNum.pop(),stkNum.pop());
stkNum.push(d);
}else if(opt.equals("add")){
int d = add(stkNum.pop(),stkNum.pop());
stkNum.push(d);
}else if(opt.equals("sub")){
int d = sub(stkNum.pop(),stkNum.pop());
stkNum.push(d);
}
}
System.out.println(stkNum.pop());
k=0; } } sc.close();
}
private static int sub(int i, int j) {
return j-i;
}
private static int add(int i, int j) {
return i+j;
}
private static int max(int i, int j) {
return i>=j?i:j;
}
private static int min(int i, int j) {
return i>=j?j:i;
}
private static NUM getNum(int p,String line){
int a=p,b=p;
while(!line.substring(a, a+1).equals("(") && !line.substring(a, a+1).equals(")")){
a--;
}
while(!line.substring(b, b+1).equals(")")&& !line.substring(b, b+1).equals("m")&& !line.substring(b, b+1).equals("a") && !line.substring(b, b+1).equals("s")){
b++;
}
String left = line.substring(a+1, p);
String right = line.substring(p+1, b);
NUM num = new NUM();
num.setLeft(-999);
num.setRight(-999);
if(left.length()>=1){
int lNum = Integer.parseInt(left);
num.setLeft(lNum);
}
if(right.length() >= 1) {
int rNum = Integer.parseInt(right);
num.setRight(rNum);
}
return num;
} }
java实现表达式求值 (20 分)-------非递归版的更多相关文章
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
- [Java]算术表达式求值之三(中序表达式转二叉树方案 支持小数)
Entry类 这个类对表达式的合法性进行了粗筛: package com.hy; import java.io.BufferedReader; import java.io.IOException; ...
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- [Java]算术表达式求值之一(中序表达式转后序表达式方案)
第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...
- ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]
http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- java实现算术表达式求值
需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...
- 奇怪的表达式求值 (java实现)
题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...
随机推荐
- three.js 离线API
- linux运维 技能树
linux运维 技能树:: 初级运维: 基础:mysql基础,网络基础,计算机基础,linux系统vim, nginx ,grep ,awk,sed ,zaabix和常用开源软件,java tomca ...
- [Gamma] 发布说明
[Gamma] 发布说明 发布网址为http://60.205.230.0 新功能前瞻 团队合作:支持多人合作完成项目 项目进度管理:便于监控项目进度 站内信系统:团队合作与审核需要 已知BUG修复 ...
- CSS3rem自适应
CSS3rem自适应 如果外层背景是 width:100%; height:100%;拉伸的背景 那top必须要用百分比 才能保证跟背景结合如果外层背景是 width:100%; 自适应宽度的背景 那 ...
- Linux内核device结构体分析
1.前言 Linux内核中的设备驱动模型,是建立在sysfs设备文件系统和kobject上的,由总线(bus).设备(device).驱动(driver)和类(class)所组成的关系结构,在底层,L ...
- Java随堂笔记三
今天学习了Java运算符的最后一部分 public static void main(String[] args) { //算数运算符:+ - * / % ++ -- // ...
- Docker-Compose通过文件声明默认的环境变量
写文目的 在写本文之前,我在做一个docker-compose项目,这里需要在docker-compose.yml配置中引用到宿主机的ip,然而docker-compose并没有命令行一个输入的选项, ...
- 【LeetCode】633. Sum of Square Numbers
Difficulty: Easy More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/sum-of-square-n ...
- Dapper安装与使用
1.VS2015直接使用nuget包搜索Dapper,安装时报错:显示版本不兼容. 于是使用命令安装dapper低版本. 步骤: 打开项目,vs工具---Nuget包管理器--程序包管理器控制台 ...
- java基础 接口私有方法
/** * 问题描述: * 我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题 * 但是这个共有方法不应该让实现类使用,应该是私有化的. * * 解决方案: * 从java 9开始,接口 ...