今天去面试,考了这个,短时间没想出来。。。

太笨了!

后来想用栈和递归做

但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了。

import java.util.Scanner;
import java.util.Stack; public class ExpressionCalc { private Stack<Character> cStack = new Stack<Character>();
private Stack<Integer> iStack = new Stack<Integer>(); // 符号等级
static int cLevel(char c) {
switch (c) {
case '(':
return 0;
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 2;
}
return 0;
} // 对栈进行运算
private void dealStack() {
char c = cStack.pop();
int num1 = iStack.pop();
int num2 = iStack.pop();
switch (c) {
case '+':
iStack.push(num1 + num2);
break;
case '-':
iStack.push(num1 - num2);
break;
case '*':
iStack.push(num1 * num2);
break;
case '/':
iStack.push(num1 / num2);
break;
}
} // 返回str的表达式的值
public int calc(char[] exp) {
while (!cStack.isEmpty()) {
cStack.pop();
}
while (!iStack.isEmpty()) {
cStack.pop();
}
cStack.push('('); for (int i = 0; i < exp.length; i++) {
if (exp[i] == ' ') {
continue;
} else if (exp[i] > '0' && exp[i] <= '9') {
int num = exp[i] - '0';
while (exp[i + 1] > '0' && exp[i + 1] < '9') {
i++;
num = num * 10 + exp[i] - '0';
}
iStack.push(num);
} else if (exp[i] == '(') {
cStack.push(exp[i]);
} else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
while (cLevel(exp[i]) < cLevel(cStack.peek())) {
dealStack();
}
cStack.push(exp[i]);
} else if (exp[i] == ')') {
while (!cStack.peek().equals('(')) {
dealStack();
}
cStack.pop();
}
}
return iStack.pop();
} public static void main(String[] args) {
Scanner sc = new Scanner(System.in); ExpressionCalc m = new ExpressionCalc();
while (sc.hasNext()) {
// 程序需要前后补一个括号
System.out.println(m.calc((sc.nextLine() + ")").toCharArray()));
} }
}

表达式求值(java)的更多相关文章

  1. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  2. 逆波兰表达式求值 java实现代码

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  3. 表达式求值--Java实现

    /*将中缀表达式--转化为后缀表达式--属于栈的一种应用 *具体思路: *1.扫描字符串,遇到操作数字符直接不管,存到一个字符串里边 *2.操作符优先级比较--定义了方法 * 栈中优先级高:出栈存进字 ...

  4. 去空格的四则运算表达式求值-Java

    笔记 package com.daidai.day4.demo1; import java.util.ArrayList; import java.util.Arrays; import java.u ...

  5. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  6. java实现算术表达式求值

    需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...

  7. 奇怪的表达式求值 (java实现)

    题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...

  8. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  9. Java描述表达式求值的两种解法:双栈结构和二叉树

    Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...

随机推荐

  1. 如何使用Xcode进行高保真原型设计?

    转载自:http://www.guimobile.net/xcode-high-fidelity-prototype-design.html Xcode不仅是开发者用来开发iOS Apps的开发工具, ...

  2. jsp版本的环境变量集合

    System.out.println("Protocol: " + request.getProtocol());System.out.println("Scheme: ...

  3. win 7 下vim的使用

    1.gVim74.exe ftp://ftp.vim.org/pub/vim/pc/gvim74.exe 2.vimcdoc-1.9.0-setup.exe 中文说明文档 http://211.147 ...

  4. Pedometer_forAndroid

    https://github.com/Nicky213Zhang/Pedometer_forAndroid 自行封装了一个计步器控件,采用:计步传感器Sensor.TYPE_STEP_COUNTER计 ...

  5. cacheManager载入问题

    net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please pr ...

  6. Javascript网页截屏的方法

    最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...

  7. mysql之slave_skip_errors选项

    要说slave_skip_errors选项,就不得不提mysql的replication机制,总的来说它分了三步来实现mysql主从库的同步 master将改变记录到二进制日志(binary log) ...

  8. PHP学习笔记(1)数组函数

    1.数组的键值操作函数: $arr = array("小明" => 98, "小红" => 76, "小黑" => 66, ...

  9. H4CK1T CTF 2016 Mexico-Remote pentest writeup

    进去网站之后发现连接都是包含类型的,就能想到文件包含漏洞(话说刚总结过就能遇到这题,也算是复习啦) 这里用php://filter/read=convert.base64-encode/resourc ...

  10. [工具04]java实现获取鼠标的坐标

    本篇博客其实没什么难度可言,在这里分享给大家,是因为有时候我们需要这个工具,java作为跨平台语言的优势在这个软件就可以体现出来,不需修改就可以在windows.mac.linux上使用这个软件. 这 ...