java算术表达式求值-中缀表达式转后缀表达式
Java中可以利用双栈算法实现算术表达式求值,下面结合代码讲解简单和复杂两种情况
1、简单的算术表达式:(((3-1)*2)+3) 左括号全在左边时!
主要思想:
(1)利用两个栈,一个栈存储数字<栈顶到栈低依次是3123>,一个栈存储符号<栈顶到栈低依次是(((-)*)+)>
(2)符号栈弹出一个符号时,是括号时则忽略,否则数据栈弹出两个数据利用该符号进行计算,将计算结果在入栈
完整java代码如下:
import java.util.*;public class StackCalculator {public static void main(String[] args) {@SuppressWarnings("resource")Scanner scan=new Scanner(System.in);String string=scan.nextLine();//将字符串转化成char类型数组char[] c=new char[string.length()];for(int i=0;i<string.length();i++){c[i]=string.charAt(i);}Stack<Integer> stackint=new Stack<Integer>();Stack<Character> stackchar=new Stack<Character>();for(int i=(string.length()-1);i>=0;i--){char ch=c[i];if(ch>='0'&&ch<='9'){//将char转成string,然后再讲string转成int<调用函数>String s=ch+"";stackint.push(Integer.parseInt(s));}if(ch>='('&&ch<='/'){stackchar.push(ch);}}char sign;int a,b,data=0;while(!stackchar.isEmpty()){sign=stackchar.pop();if(sign=='+'){a=stackint.pop();b=stackint.pop();data=a+b;stackint.push(data);}else if(sign=='-'){a=stackint.pop();b=stackint.pop();data=a-b;stackint.push(data);}else if(sign=='*'){a=stackint.pop();b=stackint.pop();data=a*b;stackint.push(data);}else if(sign=='/'){a=stackint.pop();b=stackint.pop();if(b==0){System.out.println("除数为0!");System.exit(0);}data=a/b;stackint.push(data);}}data=stackint.pop();System.out.println("Result="+data);}
}
2、复杂的算术表达式:1+2*3+(4*5+6)*7,需要转化成后缀表达式:123+45*6+7*+
主要思想:
(1)当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中
(2)如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出
(3)在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理)的时候,否则决不从栈中移走”(”。操作符中,+-优先级最低,()优先级最高
(4)如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中
(5)上述四个原则便可将中缀表达式转化成后缀表达式,然后对后缀表达式进行处理得到最终结果<具体方式:利用一个数据栈,将后缀表达式的数据依次入栈,遇到符号时则将栈中弹出两个数据,然后利用该符号进行计算,将计算结果再入栈,从此往复>
完整Java代码如下:
import java.util.*;public class StackCalculators {public static void main(String[] args) {@SuppressWarnings("resource")Scanner scan=new Scanner(System.in);String string=scan.nextLine();//将字符串转化成char类型数组char[] carray=new char[string.length()];for(int i=0;i<string.length();i++){carray[i]=string.charAt(i);}//下面程序将中缀表达式转化成后缀表达式<重点>char a,b;int k=0;char[] charray=new char[100];Stack<Character> stackchar=new Stack<Character>();Stack<Integer> stackint=new Stack<Integer>();for(int i=0;i<string.length();i++){a=carray[i];if(a>='0'&&a<='9'){charray[k++]=a;}else if(a=='*'||a=='/'||a=='('){stackchar.push(a);}else if(a==')'){b=stackchar.pop();while(b!='('){charray[k++]=b;b=stackchar.pop();}}else if(a=='+'||a=='-'){if(stackchar.isEmpty())stackchar.push(a);else{do{b=stackchar.pop();if(b=='(')stackchar.push(b);elsecharray[k++]=b;}while(!stackchar.isEmpty()&&b!='(');stackchar.push(a);}}}while(!stackchar.isEmpty()){b=stackchar.pop();charray[k++]=b;}//利用后缀表达式和一个整型数据栈计算出结果int data1,data2,data=0;for(int i=0;i<k;i++){char ch=charray[i];if(ch>='0'&&ch<='9'){//将char转成string,然后再讲string转成int<调用函数>String str=ch+"";stackint.push(Integer.parseInt(str));}else{data1=stackint.pop();data2=stackint.pop();if(ch=='+'){data=data1+data2;stackint.push(data);}else if(ch=='-'){data=data2-data1;stackint.push(data);}else if(ch=='*'){data=data1*data2;stackint.push(data);}else if(ch=='/'){if(data1==0){System.out.println("除数为0!");System.exit(0);}else{data=data2/data1;stackint.push(data);}}}}data=stackint.pop();System.out.println("Result="+data);}
}
java算术表达式求值-中缀表达式转后缀表达式相关推荐
- nyoj 1272 表达式求值(中缀式转后缀式)
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...
- c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!
已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...
- linux算术表达式求值数据结构,数据结构:算数表达式求值演示
题目:设计一个程序,演示用算符优先法对算数表达式求值的过程. 一.需求分析 以字符序列的形式从终端读入输入语法正确.不含变量的整数表达式.利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表 ...
- 用python编写表达式求值_用Python3实现表达式求值
Problem Description yizhen has no girlfriend due to his stupid brain that he even can't solve a simp ...
- python作业表达式求值_用Python3实现表达式求值
一.题目描述 请用 python3编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描述 ...
- c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...
- 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)
1 字符串算术表达式分类 字符串算术表达式分为前缀表达式.中缀表达式和后缀表达式.其中前缀表达式又称波兰表达式,后缀表达式基于前缀表达式,又称逆波兰表达式.下面给出百度百科关于几种表达式的定义: 前缀 ...
- 【经典算法】-算术表达式求值
算术表达式求值 中缀表达式 我们平时写的计算式的式子一般是这样子 格式:"操作数1 操作符 操作数2"12 * (3 + 4) - 6 + 8 / 2; // 中缀表达式 中缀表达 ...
- AVIATOR——轻量级JAVA表达式求值引擎
简介 Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator ...
- java aviator_Aviator 表达式求值引擎开源框架
简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviato ...
最新文章
- MySQL优化篇:数据准备
- Homebrew安装(MacOS)
- 6.00 Introduction to Computer Science and Programming lec5: Objects in Python
- 时下流行的9种恶意软件,你都了解吗?
- MySQL Bit Functions and Operators(二进制方法)
- Python使用ffmpeg下载m3u8拼接为视频
- 美国特勤局发布十大网络通缉犯名单
- 如何配置 Windows XP SP2 中的 Internet Explorer 增强安全功能
- 两则新闻的另外一种角度
- java.text.MessageFormat 专题
- 超简单的html登录界面
- Linux安装yum工具-安装过程
- cad刷新快捷键_47个CAD快捷键+50个技巧,了解这些CAD操作,你就偷着乐吧
- 生活之游戏中的心理学
- 8g内存一般占用多少_你到底需要多大内存?4G、8G还是16G
- php远程控制代码,内部网络机器的远程控制软件UltraVNC及其源代码
- android如何获取RAM和ROM使用情况
- Event Sourcing 和 CQRS
- APK反编译工具在ubuntu的安装及使用
- 供电抑制比 (PSRR)与开环闭环 D 类放大器
热门文章
- Oracle单实例数据库迁移到Oracle RAC 环境之(2)--实施篇
- 梦断代码----阅读笔记3
- jetty client 与apache http client的实现、分析
- Hibernate上路_18-Hibernate查询方式
- linux 如何查看 块设备_理解Linux操作系统中的块设备
- 置为底层_C语言之C语言的底层操作
- python字符串以什么为结束符_Python代码中 如何判断字符串是否使用指定字符结尾(endswith)呢?...
- 3.2自编码器(变分自编码器,VAE)
- OpenCV-图像处理(22、像素重映射(cv::remap))
- python分布式爬虫_python-分布式爬虫