表达式求值(java)
今天去面试,考了这个,短时间没想出来。。。
太笨了!
后来想用栈和递归做
但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了。
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)的更多相关文章
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 逆波兰表达式求值 java实现代码
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 表达式求值--Java实现
/*将中缀表达式--转化为后缀表达式--属于栈的一种应用 *具体思路: *1.扫描字符串,遇到操作数字符直接不管,存到一个字符串里边 *2.操作符优先级比较--定义了方法 * 栈中优先级高:出栈存进字 ...
- 去空格的四则运算表达式求值-Java
笔记 package com.daidai.day4.demo1; import java.util.ArrayList; import java.util.Arrays; import java.u ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- java实现算术表达式求值
需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...
- 奇怪的表达式求值 (java实现)
题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
随机推荐
- excel导入sql server 文本被截断,或者一个或多个字符在目标代码页中没有匹配项 错误处理
excel导入sql server 文本被截断,或者一个或多个字符在目标代码页中没有匹配项 错误处理方法: 方案1:修改注册表 出现文本被截断的原因是SQL Server的导入导出为了确定数据表的字段 ...
- Android中Context的总结及其用法
在android中我们经常遇到这样的情况,在创建一个对象的时候往往需要传递一个this参数,比如:语句 MyView mView = new MyView(this),要求传递一个this参数,这个t ...
- 多校第九场Arithmetic Sequence题解
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5400 题意:给定等差数列的差值d1,d2.问长度为n的数列中有多少个满足条件的子序列,条件为子序列中 ...
- FZU 2087 统计树边【MST相关】
Problem 2087 统计树边 Accept: 212 Submit: 651 Time Limit: 1000 mSec Memory Limit : 32768 KB Prob ...
- How to fix Cannot change version of project facet Dynamic Web Module to 3.0 Error in Eclipse---转载
How to fix Cannot change version of project facet Dynamic Web Module to 3.0 Error in Eclipse 原文:http ...
- mysql启动与关闭
撰于:http://wenku.baidu.com/link?url=QV3mEJWnU4c8VZPjKGxz4A8gSmdjO2HZY7n963UaVx4l_uPKrh16tGxLyqjf5i3MA ...
- 选择如何的系统更能适合App软件开发人员?
手机这个词早已经同吃喝玩乐一样.成为了人们生活中的必备元素. 尤其是iPhone一炮走红之后,不但手机世界发生了巨大变化,整个科技产业似乎都格局性的改变.直至今日,手机市场的竞争更是日趋白炽化,这就给 ...
- linux 查看java进程
ps -ef|grep java 1. jps 或 ps –ef|grepjava (获取PID)
- 初识PowerShell
一.简介 Windows PowerShell 是微软公司为Windows环境所开发的壳程序(shell)及脚本语言技术,采用的是命令行界面.这项全新的技术提供了丰富的控制与自动化的系统管理能力.之前 ...
- CCNA2.0笔记_路由分类
直连路由:当在路由器上配置了接口的IP地址,并且接口状态为up的时候,路由表中就出现直连路由项 静态路由:静态路由是由管理员手工配置的,是单向的. 默认路由:当路由器在路由表中找不到目标网络的路由条目 ...