中序表达式 转为 后序表达式(包含了输出运行的结果)(1310 P102)
来源:互联网 发布:office mac 更新补丁 编辑:程序博客网 时间:2024/04/29 17:47
中序表达式:我们直观看到的表达式。
中序表达式转前序表达式:就是从右向左历遍表达式,操作数在前,操作符在后的一种形式。
中序表达式转后序表达式:就是从左致右的历遍表达式,操作数在前,操作符在后的一种形式。
参考博客:
http://blog.csdn.net/zhufenghao/article/details/48863163
http://www.jianshu.com/p/a052eb2806a1(这篇是讲解中序表达式历遍前序表达式和后序表达式的)
http://blog.csdn.net/furzoom/article/details/52871716
思路:
1.分为两个Stack,一个存放数据的Stack<String> data;
另一存放操作数的Stack<String> ops;
2.历遍并改变存储的方式:
先为两个操作数,然后是操作符。
逻辑如图:
代码如下:
public class InfixToPostfix {
public static void main (String [] args){
Stack<String> data = new Stack<>();
Stack<String> ops = new Stack<>();
String[] inputs = StdIn.readAllStrings();
for (String input : inputs){
if (input.equals("(")){
continue;
}else if (input.equals(")")){
if (data.isEmpty()){
StdOut.println("Stack data is Empty!");
return;
}
if (ops.isEmpty()){
StdOut.println("Stack ops is Empty!");
return;
}
String data1 = data.pop();
String data2 = data.pop();
String op = ops.pop();
String result = data2 + data1 + op;
data.push(result);
}else if (input.equals("+") || input.equals("-")
|| input.equals("*") || input.equals("/")){
ops.push(input);
}else {
data.push(input);
}
}
StdOut.println("the end is : " + data.pop());
}
}
测试结果:
如果要求输出表达式的结果,前面已经有实现,这里从新写一遍就好:
代码如下:
package chapter1.a3;
import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class EvaluatePostfix {
public static void evaluatePostfix(String[] inputs){
Stack<String> ops = new Stack<>();
Stack<Double> data = new Stack<>();
for (String input : inputs){
if (input.equals("(")){
continue;
}else if (input.equals(")")){
if (ops.isEmpty()){
StdOut.println("Stack ops is Empty!");
return;
}
if (data.isEmpty()){
StdOut.println("Stack data us Empty!");
return;
}
String op = ops.pop();
Double data1 = data.pop();
Double data2 = data.pop();
Double result = 0.0;
if (op.equals("+")){
result = data2 + data1;
}else if (op.equals("-")){
result = data2 - data1;
}else if (op.equals("*")){
result = data2 * data1;
}else if (op.equals("/")){
result = data2 / data1;
}
data.push(result);
}else if (input.equals("+") || input.equals("-")
|| input.equals("*") || input.equals("/")){
ops.push(input);
}else {
data.push(Double.parseDouble(input));
}
}
StdOut.println("The Result is " + data.pop());
}
public static void main(String [] args){
String [] inputs = StdIn.readAllStrings();
InfixToPostfix.infixToPostfix(inputs);
evaluatePostfix(inputs);
}
}
运行结果:
阅读全文
0 0
- 中序表达式 转为 后序表达式(包含了输出运行的结果)(1310 P102)
- 1.3.10将算术表达式由中序表达式转为后序表达式(algs4)
- 《算法(第四版)》 习题:1.3.10 将算术表达式由中序表达式转为后序表达式
- 将中序表达式转为后序表达式
- 将算术表达式由中序表达式转为后序表达式
- 利用堆栈补全表达式左括号(1309 P102)
- 前(中后)序表达式讲解
- 中序表达式 to 后序表达式
- 数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
- 实现逆波兰表达式(后缀表达式)的运算结果
- 输入一个字符串表达式,输出计算结果(队列、栈的应用)
- Java程序片段与java表达式(将结果以表格的形式输出)
- 正则表达式去掉word转为html后的垃圾样式
- DoublingStackOfStrings(1308 P102)
- 中序表达式转换为后序表达式
- 中序表达式变成后序表达式 JAVA实现版本
- C#方便下次复习(看到P102了)
- 前序、中序、后序表达式
- SCI\EI以及大学毕业论文 参考文献 在文章内的引用
- 关于json格式字符串解析并用mybatis存入数据库
- Netty入门应用之第一个netty项目
- bzoj3038 上帝造题的七分钟2(线段树区间开方统计和)
- 用Echarts制作供水工程地图迁移动画
- 中序表达式 转为 后序表达式(包含了输出运行的结果)(1310 P102)
- 网易2018校招Java开发工程师笔试卷 String.split()如何分割"|"
- 网易内推2017最长01子串
- linux 下查找文件或者内容常有命令
- A
- 算法学习之旅,初级篇(12)--最小公倍数
- 【SSLGZ 2681】2017年8月11日提高组T3 难题
- 《代码整洁之道》读书笔记
- 中位数