×

算法练习(30):中序表达式与后序表达式(1.3.9-1.3.10)

96
算法之路
2017.10.23 22:43* 字数 744

本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(算法交流),想要加入的,请添加我的微信号:zhujinhui207407 谢谢。另外,本人的个人博客 http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

算法(第4版)

知识点

  • 中序表达式
  • 后序表达式

题目

1.3.9 编写一道程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) ) 你的程序应该输出((1 + 2) * ((3 - 4) * (5 - 6)))


1.3.9 Write a program that takes from standard input an expression without left pa- rentheses and prints the equivalent infix expression with the parentheses inserted. For example, given the input:

1 + 2 ) * 3 - 4 ) * 5- 6 ) ) )

your program should print

( ( 1 + 2 ) * ( ( 3 -4 ) * ( 5 - 6 ) )

题目

1.3.10 编写一个过滤器InfixToPostfix,将算术表达式由中序表达式转为后序表达式。


1.3.10 Write a filter InfixToPostfix that converts an arithmetic expression from infix to postfix.

分析

中序表达式
中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被电脑解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。 与前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。

后序表达式
逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。 逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构减少计算机内存访问。逆波兰记法和相应的算法由澳大利亚哲学家、计算机学家查尔斯·汉布林(Charles Hamblin)在1960年代中期扩充后缀表示法,或称为逆波兰表示法。

答案

public static void main(String[] args) {
        String expression = "(1+((2+3)*(4*5)))";
        Stack<String> ops = new Stack<String>();
        double result = 0;
        for (int j = 0; j < expression.length(); j++) {
            char charAtIndex = expression.charAt(j);
            String s = String.valueOf(charAtIndex);
            if (s.equals("(")) {
                ;
            } else if (s.equals("+")) {
                ops.push(s);
            } else if (s.equals("-")) {
                ops.push(s);
            } else if (s.equals("*")) {
                ops.push(s);
            } else if (s.equals("/")) {
                ops.push(s);
            } else if (s.equals(")")) {
                String op = ops.pop();
                System.out.print(op);
            } else {
                System.out.print(s);
            }
        }
    }

代码索引

InfixToPostfix.java

视频讲解

点此观看分析视频:顶级程序员教你学算法(30)-中序表达式与后序表达式(1.3.9)

日记本
Web note ad 1