中缀表达式转后缀表达式(逆波兰)
来源:互联网 发布:环境污染数据表格 编辑:程序博客网 时间:2024/06/05 07:22
一、中缀表达式转后缀表达式
中缀表达式就是普通的表达式。如:9+(3-1)*3+10/2
后缀表达式是一种不需要括号的表示法,又叫逆波兰表达式。
上面的式子用后缀法表示:9 3 1 - 3 * + 10 2 / +
那么如何转化成后缀表达式?
思路:
从左往右遍历:
1. 如果是数字则直接输出
2. 如果是符号则入栈,但要通过以下判断
- 若该符号c是右括号或者c的优先级≤栈顶符号,则栈中元素依次出栈输出,c入栈
代码实现:
//中缀转后缀表达式(逆波兰)------栈实现public class NiPoLan2 { public static void main(String[] args) { //创建栈 Stack<String> s = new Stack<String>(); String s1 = "9+(3-1)*3+10/2"; //例子 (1-2)*(4+5) 9+(3-1)*3+10/2 char[] o = s1.toCharArray(); String r = ""; //字符串r记录输出 //遍历 for(int i=0;i<o.length;i++){ //符号是数字 if(Character.isDigit(o[i])){ //判断两位整数,如10 if(i<o.length-1&&Character.isDigit(o[i+1])){ r = r+o[i]+o[i+1]+" "; i++; //减少一次循环 continue; } r = r+o[i]+" "; } //符号是 ( if(o[i]=='('){ s.push(o[i]+""); } //符号是+ or - if(o[i]=='+'|o[i]=='-'){ //栈不为空,且有乘除符号,则弹出 if(!s.isEmpty()&&(s.peek().equals("*")|s.peek().equals("/"))){ //全部出栈 while(!s.isEmpty()){ r = r + s.pop()+" "; } //出栈后,再将+-入栈 s.push(o[i]+""); //栈为空 }else{ s.push(o[i]+""); System.out.println(o[i]+""); } } //符号是右括号则配对 if(o[i]==')'){ String a = s.pop(); System.out.println(a); r = r + a+" "; s.pop(); } //符号是乘除 if(o[i]=='*'|o[i]=='/'){ System.out.println(s.peek()); //栈顶是加减、括号 if(s.isEmpty()){ s.push(o[i]+""); }else if(s.peek().equals("+")|s.peek().equals("-")|s.peek().equals("(")){ //s.peek()=="-"|s.peek()=="+"|s.peek()=="(" s.push(o[i]+""); } //栈顶是乘除,则出栈 else if(s.peek()=="*"|s.peek()=="/"){ //全部出栈 while(!s.isEmpty()){ r = r + s.pop(); } s.push(o[i]+""); } } } //最后栈中不为空,全部出栈 while(!s.isEmpty()){ r = r + s.pop()+" "; } System.out.println(r);}}
输出结果:
9 3 1 - 3 * + 10 2 / +
二、计算后缀表达式
中缀表达式容易计算:9+(3-1)*3+10/2=20
那么后缀表达式如何计算呢?
还是上面的例子: 9 3 1 - 3 * + 10 2 / +
思路:
从左往右遍历:
- 遇到数字就入栈
- 遇到符号就将栈顶的两个元素取出计算,将结果入栈;最后栈中的数就是最终结果
代码实现:
public class NiPoLan { public static void main(String[] args) { Stack<Integer> s = new Stack<Integer>(); String s1 = "9 3 1 - 3 * + 10 2 / +"; String[] r = s1.split(" "); //转为字符串数组 System.out.println(s1); for(int i=0;i<r.length;i++){ //判断字符串r[i]是数字还是符号 //r[i]是数字,入栈 if(Character.isDigit(r[i].charAt(0))){ int c = Integer.valueOf(r[i]); s.push(c); }else{ //r[i]是符号,则运算 switch (r[i]) { case "-": int a = s.pop(); int b = s.pop(); s.push(b-a); break; case "+": a = s.pop(); b = s.pop(); s.push(b+a); break; case "/": a = s.pop(); b = s.pop(); s.push(b/a); break; case "*": a = s.pop(); b = s.pop(); s.push(b*a); break; default: break; } } } //输出结果 System.out.println(s.pop()); } }
输出结果:
9 3 1 - 3 * + 10 2 / +20
结果为 20。
阅读全文
1 0
- 中缀表达式转后缀表达式(逆波兰表达式)
- 中缀表达式转后缀表达式(逆波兰表达式)
- 中缀表达式转后缀表达式(逆波兰式)
- 中缀表达式转后缀表达式(又称逆波兰式)
- 中缀表达式转后缀表达式(逆波兰)
- 逆波兰表达式 中缀表达式 后缀表达式
- 数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
- 【基础知识】【中缀转逆波兰(后缀)表达式】
- 前缀、中缀、后缀表达式(逆波兰表达式)
- 逆波兰式(中缀表达式转成后缀表达式)
- 【数据结构】中缀表达式转换后缀表达式(逆波兰式)
- 中缀表达式转化为后缀表达式,计算中缀表达式,计算后缀表达式(有注释)(逆波兰表达式)
- 数据结构-----栈(逆波兰表达式)----中缀转后缀
- 中缀表达式转后缀表达式(逆波兰式)的C++代码
- 【数据结构】逆波兰表示法(RPN):中缀表达式转后缀表达式
- NYOJ-35-表达式求值(中缀式转后缀式 逆波兰表达式)
- 中缀表达式转逆波兰
- 逆波兰:将中缀表达式转为后缀表达式
- FPGA基础实验:使用LED验证译码器逻辑
- JS——图片轮播(淡入淡出)
- 几种开源许可协议
- Mibilenet-SSD的Caffe系列实现
- 基于selenium爬取图片并转存到百度网盘
- 中缀表达式转后缀表达式(逆波兰)
- xml文件--DOM4J方式解析xml文件
- windows10下使用gyp编译google_breakpad
- 演讲主题更新:12月9号下午深圳Linuxer聚会下午茶交流
- 线段树学习
- 成绩排序
- Salesforce -- 代码控制记录共享
- OpenCV--形态学操作
- 指针编程错误