/*将中缀表达式--转化为后缀表达式--属于栈的一种应用
*具体思路:
*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实现的更多相关文章

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

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

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

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

  3. 表达式求值(java)

    今天去面试,考了这个,短时间没想出来... 太笨了! 后来想用栈和递归做 但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了. import java.util.Scanner; imp ...

  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. Calico 的默认连通性 - 每天5分钟玩转 Docker 容器技术(69)

    前面我们完成了 Calico 网络的部署并运行了容器,今天将讨论 Calico 的连通性. 测试一下 bbox1 与 bbox2 的连通性: ping 成功,数据包流向如下图所示. ① 根据 bbox ...

  2. expect实现scp/ssh-copy-id非交互

    expect工具可以实现自动应答,从而达到非交互的目的. expect具体使用用法比较复杂,中文手册我正在翻译中,以后翻译完了做了整理再补.本文只有几个ssh相关最可能用上的示例. yum -y in ...

  3. Linux文件管理_1

    在Linux中,全部都是文件,所以文件管理在Linux上格外重要,在我们学习文件管理前,我们先学习几个关于文件的命令,之后才能更好的学习文件管理. 目录 pwd命令 cd命令 列出文件内容ls 查看文 ...

  4. 【概率论与数理统计】小结4 - 一维连续型随机变量及其Python实现

    注:上一小节总结了离散型随机变量,这个小节总结连续型随机变量.离散型随机变量的可能取值只有有限多个或是无限可数的(可以与自然数一一对应),连续型随机变量的可能取值则是一段连续的区域或是整个实数轴,是不 ...

  5. Java并发之CyclicBarrier、CountDownLatch、Phaser

    在Java多线程编程中,经常会需要我们控制并发流程,等其他线程执行完毕,或者分阶段执行.Java在1.5的juc中引入了CountDownLatch和CyclicBarrier,1.7中又引入了Pha ...

  6. 树状数组(Binary Indexed Tree,BIT)

    树状数组(Binary Indexed Tree) 前面几篇文章我们分享的都是关于区间求和问题的几种解决方案,同时也介绍了线段树这样的数据结构,我们从中可以体会到合理解决方案带来的便利,对于大部分区间 ...

  7. 【 js 基础 】关于this

    this 关键字是 Javascript 中很特别的一个关键字,被自动定义在所有函数的作用域中.this提供了一种更优雅的方式隐式"传递"一个对象的引用.今天就来说说 this 的 ...

  8. 2.bootstrap-全局css

    1.Bootstrap 网格系统 Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 1.基本的网格结构 下面是 ...

  9. http_load压力测试windows版使用方法及结果分析

    工具下载: https://pan.baidu.com/s/1gftN13H 配置说明:解压后将cygwin1.dll 放置到 C:\Windows\system目录下,将http_load.exe ...

  10. maven编译时错误:无效的目标发行版

    (转)Maven 将依赖打进一个jar包 博客分类: maven   maven配置 <?xml version="1.0" encoding="UTF-8&quo ...