中序表达式 转为 后序表达式(包含了输出运行的结果)(1310 P102)
2017-08-12 17:05
239 查看
中序表达式:我们直观看到的表达式。
中序表达式转前序表达式:就是从右向左历遍表达式,操作数在前,操作符在后的一种形式。
中序表达式转后序表达式:就是从左致右的历遍表达式,操作数在前,操作符在后的一种形式。
参考博客:
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);
}
}
运行结果:
中序表达式转前序表达式:就是从右向左历遍表达式,操作数在前,操作符在后的一种形式。
中序表达式转后序表达式:就是从左致右的历遍表达式,操作数在前,操作符在后的一种形式。
参考博客:
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);
}
}
运行结果:
相关文章推荐
- 规定输入的字符串中,只能包含字母和*号,编写函数fun(char *a),其功能是:将字符串前、后的连续*号全部删除。主函数中输入字符串,调用函数,并输出结果字符串。例如:若字符串中的内容为: ***
- Phpstorm在控制台中输出运行结果
- 输入一个字符串表达式,输出计算结果(队列、栈的应用)
- 3*(4+6)-7 # 用代码实现这个运算表达式,仅包含逆波兰式部分,算术结果部分未写出
- Chapter9——分析下面的程序,写出其运行时的输出结果/将程序第5行改为Date(int=1,int=1,int=2005);修改程序使之能通过编译
- 输入一个字符串表达式,输出计算结果
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历的结果,输出后序遍历结果。
- 利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化 分类: Python ArcGIS for desktop ArcGIS for server 2015-08-06 19:49 3人阅读 评论(0) 收藏
- 需找符合条件的整数(输入整数N,输出一个最小自然数M,使N*M结果只包含1跟0)
- 第12周项目1(2)-阅读带有全局变量的程序并输出运行结果
- 请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 初学OpenCV3,运行编程入门上读取并播放视频的原版程序,编译通过但是没有任何输出,已按网上博主各种方法试,还是没有结果,大家看怎么解决?
- 利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化
- phpstorm在控制台输出脚本运行结果
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- 使用Jenkins邮件配置在邮件中输出测试运行详细结果
- 阅读程序,分析输出结果。/修改程序第2行为const Student stud(101,78.5),修改程序使之正常运行。
- 给定一个只包含小写字母的字符串,删除重复的字母,每个字母只出现一次。在所有结果中,输出字典顺序最小的。
- 将算术表达式由中序表达式转为后序表达式