表达式求值(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 数据保证: 保 ...
随机推荐
- unity3d协同不同设备的代码
unity3d的脚本代码中,Update()函数每一帧都会运行一次. 假设有这两台设备:一台超级四路泰坦计算机,一台旧手机,它们一起运行一个赛跑游戏,Update()函数每一帧运行一次,游戏中的小人就 ...
- Mac /Ubuntu/Windows 下安装nodejs
Mac If you're using the excellent homebrew package manager, you can install node with one command: b ...
- 关于wcf,webservice,webapi或者其他服务或者接口有什么区别 WCF、WebAPI、WebService之间的区别 【转载】HTTP和SOAP完全就是两个不同的协议 WebService学习总结(一)——WebService的相关概念
wcf,webservice采用的是rpc协议,这个协议很复杂,所以每次要传递.要校验的内容也很复杂,别看我们用的很简单,但实际是frame帮我们做掉了rpc生成.解析的事情webapi遵循是rest ...
- VMware安装Centos7超详细过程(图文)
1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:CentOS6 ,如果没有镜像可以在阿里云下载 https://mirrors.aliyun.com/centos/ 硬件 ...
- Linux上寻找并杀死僵尸进程
转载: http://blog.csdn.net/shanzhizi/article/details/47320595 linux服务器上,多少会出现一些僵尸进程,下面介绍如何快速寻找和消灭这些僵尸进 ...
- unity5, UI Button "On Button Down"
unity5自带的UI Button的Inspector面板中只有On Click事件,如果我们想让一个按钮响应On Button Down事件该怎么办呢?方法是: 点Add Component-&g ...
- POJ2185-Milking Grid(KMP,next数组的应用)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6317 Accepted: 2648 Desc ...
- PHP获得数组的交集与差集
PHP获得数组的交集与差集 作者:简明现代魔法图书馆 发布时间:-- :: 次阅读 服务器君一共花费了218. ms进行了6次数据库查询,努力地为您提供了提供了这个页面. 数组的交集 array_in ...
- python django中使用sqlite3数据库 存储二进制数据ByteArray
在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...
- 抓取网页数据C#文件
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...