• 左括号补全


    题目来自《算法》第四版习题1.3.9,原题如下:

    Write a program that takes from standard input an expression without left parentheses 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、(a+b      a+b型,直接在后面补右括号即可
    2、((...      a是括号型,递归调用自己
    3、(a+(      a+括号型,输出a+,递归调用自己
    很显然,需要定义一个函数CompleteBracket来实际递归:
    1、取字符串,输出之,如果是左括号,则递归调用本函数(a)
    2、取字符串,输出之(运算符)
    3、取字符串,输出之,如果是左括号,则递归调用本函数(b)
    4、输出右括号

    代码实现如下:

    View Code
    import java.util.Scanner;
    
    public class Program {
        public static void main(String args[]) {
            In in = new In(new Scanner("( ( 1 + 2 * ( ( 3 - 4 * ( 5 - 6"));
            CompleteBracket(in);
            StdOut.println();
        }
    
        private static void CompleteBracket(In in) {
            if (in.isEmpty()) return;
            String p1 = in.readString();
            Output(p1);
            if (p1.equals("("))
                CompleteBracket(in);
    
            if (in.isEmpty()) return;
            String op = in.readString();;
            Output(op);
    
            if (in.isEmpty()) return;
            String p2 = in.readString();;
            Output(p2);
            if (p2.equals("("))
                CompleteBracket(in);
    
            Output(")");
        }
    
        private static void Output(String s) {
            StdOut.printf("%s ", s);
        }
    
    
    }

     实际了补全右括号,补全左括号其实就是将字符串反转,然后将右括号看作左括号进行处理,然后再进行反转即可:

    View Code
    import java.util.Scanner;
    
    public class Program {
        private static String buffer = "";
    
        public static void main(String args[]) {
            String pattern = "1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )";
            pattern = new StringBuffer(pattern).reverse().toString();
            In in = new In(new Scanner(pattern));
            CompleteBracket(in);
            buffer = new StringBuffer(buffer).reverse().toString();
            StdOut.println(buffer);
        }
    
        private static void CompleteBracket(In in) {
            if (in.isEmpty()) return;
            String p1 = in.readString();
            Output(p1);
            if (p1.equals(")"))
                CompleteBracket(in);
    
            if (in.isEmpty()) return;
            String op = in.readString();;
            Output(op);
    
            if (in.isEmpty()) return;
            String p2 = in.readString();;
            Output(p2);
            if (p2.equals(")"))
                CompleteBracket(in);
    
            Output("(");
        }
    
        private static void Output(String s) {
            buffer += String.format("%s ", s);
        }
    
    
    }

    代码中用到了一些书中提到的库,可以在官方网站上下载:
    http://algs4.cs.princeton.edu/home/

  • 相关阅读:
    套接口编程
    传输层
    1 简介
    共享池2
    jquery.dataTables列中内容居中问题?求解?
    bootstrap-multiselect.js多选下拉框初始化时默认选中初始值
    datatable 动态显示/隐藏列
    bootstrap table 主子表 局部数据刷新(刷新子表)
    bootstrap table 怎么实现前两列固定冻结?
    bootstrapTable表格表头换行
  • 原文地址:https://www.cnblogs.com/sdflysha/p/3049596.html
Copyright © 2020-2023  润新知