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 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...
随机推荐
- HBase快照迁移数据失败原因及解决办法
目录 目录 1 1. 背景 1 2. 环境 1 3. 执行语句 1 4. 问题描述 1 5. 错误信息 2 6. 问题原因 3 7. 解决办法 4 1. 背景 机房裁撤,需将源HBase集群的数据迁移 ...
- python paramiko的使用介绍
一: 使用paramiko #设置ssh连接的远程主机地址和端口t=paramiko.Transport((ip,port))#设置登录名和密码t.connect(username=username, ...
- 洛谷 P2615 神奇的幻方
传送门 I'm here! 思路 这个题,我们可以直接去模拟,因为范围很小,且\(N\)都是奇数 直接构造一个矩阵,初始值都为\(0\),然后\(while\)循环,根据题目给出的\(4\)个条件进行 ...
- webpack中的hash、chunkhash、contenthash区别
hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值.如果文件内容改变的话,那么对应文件哈希值也会改变,对应的HTML引用的URL地址也会改变,触发CD ...
- docker 部署 jenkins
建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository). 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 ...
- gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过
我怕我不写下来,将来我都不记得我还在 c 中嵌套过汇编语言,用汇编代码调用一个c函数的过程. 折腾了一下午,在网上查看相关的资料,然后照葫芦画瓢地在c代码中嵌套汇编,希望解决我所遇到的问题,可最后发现 ...
- centos6.5 安装hadoop1.2.1亲测版
本篇只简单介绍安装步骤 1. 角色分配 10.11.84.4 web-crawler--1.novalocal master/slave 10.11.84.5 web-crawler--2.nova ...
- 剑指阿里P6,25岁小伙怒斩三面,喜提offer(Java研发岗)
本文提供者:洎扰の庸人 微信公众号:慕容千语的架构笔记.欢迎关注一起进步. 进阿里一直都是身为程序员的我,最初的梦想,经过去年面试蚂蚁金服失败的挫折后,今年再次鼓起勇气投简历,经过一位前辈的内推省了很 ...
- 解决element-ui表格表头内容太长时的换行问题
在用vue+element-ui做一个后台管理系统时,遇到这样的问题, 如图: 使用el-table做一个表格,当表头内容过长时会换行,在不设置的宽度的时候每一列的宽度是等比例分配的,虽然elemen ...
- Kafka Consumer Lag Monitoring
Sematext Monitoring 是最全面的Kafka监视解决方案之一,可捕获约200个Kafka指标,包括Kafka Broker,Producer和Consumer指标.尽管其中许多指标很 ...