zoukankan      html  css  js  c++  java
  • 补全左括号

    问题:

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

    解:

      1 + 2)应该变成(1+2),这里的操作数是1和2,运算符是+,这里的逻辑是 "操作数1+运算符+操作数2+)" 应该变成"(操作数1+运算符+操作数2+)"。。。意思就是如果(1+2)*(3-4)),这里的操作数分别是(1+2)和(3-4),运算符是*,这是基本思路。

      这里使用两个栈,一个data栈存储操作数,一个op栈存储运算符,当 "操作数1+运算符+操作数2+) =>(操作数1+运算符+操作数2+)"这一个操作完成后"(操作数1+运算符+操作数2+)"将作为一个操作数存储在data栈中。

    完整代码:

    public class test {
    
        static void rank(String a){
            Stack<String> op = new Stack<String>();
            Stack<String> data = new Stack<String>();
            for (int i = 0; i < a.length(); i++ ){
                if(isNum(a.charAt(i))){
                    //如果是数字
                    data.push(String.valueOf(a.charAt(i)));
                }
                if(isOp(a.charAt(i))){
                    //如果是运算符
                    op.push(String.valueOf(a.charAt(i)));
                }
                if(a.charAt(i) == ')'){
                    //如果是右括号
                    String d1 = data.pop();
                    String d2 = data.pop();
                    String ops = op.pop();
                    data.push("(" + d2 + ops + d1 + ")");
                }
            }
            //打印结果
            System.out.println(popAllStack(data));
        }
    
        //递归实现将整个栈连接成一个String
        static String popAllStack( Stack<String> stack){
            String result = stack.pop();
            if(stack.empty()){
                return result;
            }
            return result + popAllStack(stack);
        }
    
        //判断是一个数
        static Boolean isNum(char a){
            if(a >= '0' && a <= '9'){
                return true;
            }
            return false;
        }
    
        //判断是一个运算符
        static Boolean isOp(char a){
            if ("+-*/".indexOf(String.valueOf(a)) != -1){
                return true;
            }
            return false;
        }
    
        public static void main(String[] args) {
            String a = "1+2)*3-4)*5-6)))";
            rank(a);
        }
    }
    • 问题1:1+2)*3-4)*5-6)))为什么不能是(((1+2)*(3-4)*5-6))),,不过这个不重要,强行把题目变得简单而已。。
    • 问题2:数字是多位怎么办,比如122+332)*3-4)*5-6))),修改一下操作数进栈的部分即可,修改思路是:122+332)* 166+233 一个数字的结束后会接上一个运算符、右括号或者字符串结束。
    public class test {
    
        static void rank(String a){
            Stack<String> op = new Stack<String>();
            Stack<String> data = new Stack<String>();
            String num = "";
            for (int i = 0; i < a.length(); i++ ){
                if(isNum(a.charAt(i))){
                    //如果是数字
                    num = num + a.charAt(i);
                    System.out.println(num);
                    if(a.charAt(i + 1) == ')' || isOp(a.charAt(i + 1))) {
                        data.push(num);
                        num = "";
                    }
                }
                if(isOp(a.charAt(i))){
                    //如果是运算符
                    op.push(String.valueOf(a.charAt(i)));
                }
                if(a.charAt(i) == ')'){
                    //如果是右括号
                    String d1 = data.pop();
                    String d2 = data.pop();
                    String ops = op.pop();
                    data.push("(" + d2 + ops + d1 + ")");
                }
            }
            //打印结果
            System.out.println(popAllStack(data));
        }
    
        //递归实现将整个栈连接成一个String
        static String popAllStack( Stack<String> stack){
            String result = stack.pop();
            if(stack.empty()){
                return result;
            }
            return result + popAllStack(stack);
        }
    
        //判断是一个数
        static Boolean isNum(char a){
            if(a >= '0' && a <= '9'){
                return true;
            }
            return false;
        }
    
        //判断是一个运算符
        static Boolean isOp(char a){
            if ("+-*/".indexOf(String.valueOf(a)) != -1){
                return true;
            }
            return false;
        }
    
        public static void main(String[] args) {
            String a = "12+2)*3-4)*5-6898)))";
            rank(a);
        }
    }
  • 相关阅读:
    linux之间文件共享的方式
    linux访问windows文件的方法
    linux下samba配置
    linux下ftp搭建
    windws下搭建ftp步骤
    索引的二元高度
    Oracle表的分析统计
    oracle———索引
    这些git技能够你用一年了
    使用 Composer 为 ThinkPHP(3.2.3)框架添加和管理组件
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/8176954.html
Copyright © 2011-2022 走看看