表达式求值--Java实现
/*将中缀表达式--转化为后缀表达式--属于栈的一种应用
*具体思路:
*1.扫描字符串,遇到操作数字符直接不管,存到一个字符串里边
*2.操作符优先级比较--定义了方法
* 栈中优先级高:出栈存进字符串,当前的操作符进栈
* 当前操作符优先级高,直接进栈
* 对于左边括号直接进栈,右边括号涉及栈中出栈
*3.扫描完了在将栈中的出栈和操作数存储在一起
*转化完直观的表现:操作数相对位置不变,操作符相对位置相反
* */
public class IntoSuffixExpression {
private CharStack stack;
private String input;
private String output = ""; public IntoSuffixExpression(String in) {
input = in;
stack = new CharStack(input.length());
} //转化为后缀表达式
public String doTrans(){
for(int i = 0; i < input.length();i++){
char ch = input.charAt(i);
stack.displayStack("For " + ch + " ");
/*分析读到的元素的类型--操作符/操作数(默认添加到输出字符串中)
*对于操作符分类并进行优先级比较 乘除优先级高于加减*/
switch(ch){
case '+':
case '-':
gotOper(ch,1);//需要判断优先级prec1:设定的是当前的优先级
break;
case '*':
case '/':
gotOper(ch,2);//需要判断优先级
break;
case '(':
stack.push(ch);//左括号优先级最高直接进栈
break;
case ')':
gotParent(ch);//碰到右边括号涉及出栈
break;
default:
output = output + ch;//是操作数就直接存在输出字符串中
break;
}
}
//打印战中的操作符返回后缀表达式字符串
while(!stack.isEmpty()){
stack.displayStack("while");
output = output + stack.pop();
}
stack.displayStack("end");
return output;
} //比较当前的操作符与栈里面的操作符优先级--进行不同的操作
public void gotOper(char opThis, int prec1) {
while(!stack.isEmpty()){
char opTop = stack.pop();
if(opTop == '('){ //如果栈中顶是左边括号就进去跳出循环
stack.push(opTop);
break;
}
else{
int prec2;
//记录栈中操作符优先级--加减优先级是1乘除优先级是2
if(opTop == '+' || opTop == '-'){
prec2 = 1;
}
else{
prec2 = 2;
}
//栈中优先级小结束比较--当前执行进栈操作
if(prec2 < prec1){
stack.push(opTop);
break;
}
//栈中优先级大就出栈存储在字符串中
else{
output = output + opTop;
}
}
}
//栈为空就直接进栈或者遇到左边括号也是直接进栈或者栈存储比栈中优先级小的
stack.push(opThis);
} //越到右边括号进行出栈的操作--直到遇到左边括号
public void gotParent(char ch){
while(!stack.isEmpty()){
char chx = stack.pop();
if(chx == '('){
break;
}
else{
output = output + chx;
}
}
} }
/*计算后缀表达式的值--也用的是栈
* */
public class CalculateSuffixExpression {
private MyStack stack;
private String input; //注意这里传入的字符串是后缀的表达式
public CalculateSuffixExpression(String in) {
input = in;
} //数字进栈,操作符栈中元素出栈对应相应的操作
public long calculateValue(){
stack = new MyStack(20);
char ch;
int j;
long num1,num2,interAns;
for(j = 0;j < input.length();j++){
ch = input.charAt(j);
stack.displayStack("" + ch + "");
if(ch >= '0' && ch <= '9'){ //操作数
stack.push((long)(ch - '0'));
}
else{
num2 = stack.pop();
num1 = stack.pop();
switch(ch){
case'+':
interAns = num1 + num2;
break;
case'-':
interAns = num1 - num2;
break;
case'*':
interAns = num1 * num2;
break;
case'/':
interAns = num1 / num2;
break;
default:
interAns = 0;
}
stack.push(interAns);
}//end else
}//end for
interAns = stack.pop();
return interAns;
}//end method public static void main(String[] args){
//转化后缀表达式
String s = "3+(6*9)+2-6/(3-1)";
IntoSuffixExpression is = new IntoSuffixExpression(s);
String out = is.doTrans(); //计算后缀表达式
CalculateSuffixExpression cse = new CalculateSuffixExpression(out);
long result = cse.calculateValue();
System.out.println(result); } }
表达式求值--Java实现的更多相关文章
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 逆波兰表达式求值 java实现代码
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 表达式求值(java)
今天去面试,考了这个,短时间没想出来... 太笨了! 后来想用栈和递归做 但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了. import java.util.Scanner; imp ...
- 去空格的四则运算表达式求值-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 数据保证: 保 ...
随机推荐
- linux 下怎样查找一个文件夹在哪个目录下?
如果只显示所在目录的路径: find 目录 -type d -name "查询目录名" -printf "%h\n" 如果同时显示目录名称和所在目录的路径: f ...
- springmvc02
1,创建实体类对象User 注意要导入 bean-validator.jar 包 package com.yangw.springmvc.entity; import org.hibernate.va ...
- Spring MVC 的文件下载
在看Spring MVC文件下载之前请先看Spring MVC文件上传 地址:http://www.cnblogs.com/dj-blog/p/7535101.html 文件下载比较简单,在超链接中指 ...
- kvm 虚拟化的使用
kvm原理:基于内核空间虚拟化,加载内核模块,来做到虚拟化(简称内核空间).基于qemu连接内核,driver驱动连接kvm的API接口(简称用户空间): hypervisor 管理硬件设备,传统的虚 ...
- Wrong FS: hdfs://......, expected: file:///
单机版使用的是FileSystem类的静态函数: FileSystem hdfs = FileSystem.get(conf) 伪分布式下需要使用Path来获得 Path path = new Pat ...
- Hive任务优化(2)
JOIN优化 1.大多数情况下,Hive会对每对Join连接对象启动一个MapReduce任务. 2.多表关联时,如果每个ON子句都使用相同的连接键的话,那么只会产生一个MapReduce Job. ...
- 使用http -server 搭建本地简易文件服务器
安装 npm install http-server -g 使用 1. cd project . 2. hs [pwd] -o, 默认是当前路径 ./ 3. 其他选项 -p Port to use ( ...
- H5页面解决IOS进入不自动播放问题(微信内)
废话少说,直接上代码. 主要还是调用微信的jdk做兼容处理.,安卓可自动播放. ($(function(){ $(function(){ /* ** 复选框*/ $('.ul-radio').on(' ...
- Mybatis #{ } 和 ${ } 区别
动态 SQL 是 Mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因.Mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql ...
- myeclipse的快捷键
------------------------------------MyEclipse 快捷键1(CTRL)-------------------------------------Ctrl+1 ...